Python cookbook(数据结构与算法)将名称映射到序列元素中的方法


Posted in Python onMarch 22, 2018

本文实例讲述了Python将名称映射到序列元素中的方法。分享给大家供大家参考,具体如下:

问题:希望通过名称来访问元素,减少结构中对位置的依赖性

解决方案:使用命名元组collections.namedtuple()。它是一个工厂方法,返回的是python中标准元组类型的子类,提供给它一个类型名称以及相应的字段名称,它就返回一个可实例化的类,为你以定义好的字段名称传入值等。

命名元组的主要作用在于将代码同它所控制的元素位置间进行解耦

>>> from collections import namedtuple
>>> Sub=namedtuple('Subscriber',['addr','joined'])
>>> subscriber=Sub('lucy@example.com','2016-8-7')
>>> subscriber
Subscriber(addr='lucy@example.com', joined='2016-8-7')
>>> subscriber.addr
'lucy@example.com'
>>> subscriber.joined
'2016-8-7'

namedtuple的实例与普通的元组是可互换的,而且支持所有普通元组所支持的操作,例如索引和分解(unpacking).

>>> len(subscriber)
2
>>> addr,joined=subscriber
>>> addr
'lucy@example.com'
>>> joined
'2016-8-7'
>>>

使用普通元组的代码:

def compute_cost(records):
  total = 0.0
  for rec in records:
    total += rec[1] * rec[2]
  return total

通过位置来引用元素使得代码的表达力不够,而且也依赖于记录的具体结构。

下面是使用命名元组的版本:

# example.py
from collections import namedtuple
Stock = namedtuple('Stock', ['name', 'shares', 'price'])
def compute_cost(records):
  total = 0.0
  for rec in records:
    s = Stock(*rec)
    total += s.shares * s.price
  return total
# Some Data
records = [
  ('GOOG', 100, 490.1),
  ('ACME', 100, 123.45),
  ('IBM', 50, 91.15)
]
print(compute_cost(records))

运行结果:

65912.5

补充:

如果要构建涉及字典的大型数据结构,使用namedtuple会更加有效。但是注意,与字典不同的是,namedtuple是不可变的。例如:

>>> s=Stock('ACMS',100,123.45)
>>> s
Stock(name='ACMS', shares=100, price=123.45)
>>> s.shares=75
Traceback (most recent call last):
 File "<pyshell#2>", line 1, in <module>
  s.shares=75
AttributeError: can't set attribute
>>>

若要修改属性,可使用namedtuple实例的_replace()方法来实现。该方法会创建一个全新的命名元组,并对相应的值做替换;

>>> s=s._replace(shares=75)
>>> s
Stock(name='ACMS', shares=75, price=123.45)
>>>

_replace()方法一个微妙的用途是它可以作为一种简便的方法填充具有可选或缺失字段的命名元组。

步骤:

1、创建一个包含默认值的“原型”元组;

2、使用_replace()方法创建一个新实例,把相应的值替换掉;

from collections import namedtuple
Stock = namedtuple('Stock', ['name', 'shares', 'price','date','time'])
#创建一个包含默认值的“原型”元组
stock_prototype=Stock('',0,0.0,None,None)
#创建一个函数实现将字典转化为Stock类型
def dict_to_stock(s):
  return stock_prototype._replace(**s)
a={'name':'ACMS','shares':100,'price':123.45}
print(dict_to_stock(a))
b={'name':'ACMS','shares':100,'price':123.45,'date':'2016-08-08'}
print(dict_to_stock(b))
c={'name':'ACMS','price':123.45}
print(dict_to_stock(c))

运行结果:

Stock(name='ACMS', shares=100, price=123.45, date=None, time=None)
Stock(name='ACMS', shares=100, price=123.45, date='2016-08-08', time=None)
Stock(name='ACMS', shares=0, price=123.45, date=None, time=None)

注意:如果我们的目标是定义一个高效的数据结构,而且将来会修改各种实例属性,那么不推荐namedtuple!

(代码摘自《Python Cookbook》)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
使用python检测手机QQ在线状态的脚本代码
Feb 10 Python
Python通过解析网页实现看报程序的方法
Aug 04 Python
Python解析网页源代码中的115网盘链接实例
Sep 30 Python
Python利用flask sqlalchemy实现分页效果
Aug 02 Python
python添加模块搜索路径方法
Sep 11 Python
Pandas中把dataframe转成array的方法
Apr 13 Python
一篇文章读懂Python赋值与拷贝
Apr 19 Python
Python编程中flask的简介与简单使用
Dec 28 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
Sep 29 Python
python多项式拟合之np.polyfit 和 np.polyld详解
Feb 18 Python
Python爬虫实现vip电影下载的示例代码
Apr 20 Python
改变 Python 中线程执行顺序的方法
Sep 24 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
Mar 22 #Python
python实现将excel文件转化成CSV格式
Mar 22 #Python
python 对象和json互相转换方法
Mar 22 #Python
利用python将json数据转换为csv格式的方法
Mar 22 #Python
解决python3中解压zip文件是文件名乱码的问题
Mar 22 #Python
Python爬虫工程师面试问题总结
Mar 22 #Python
Python入门必须知道的11个知识点
Mar 21 #Python
You might like
PHP实现根据设备类型自动跳转相应页面的方法
2014/07/24 PHP
ThinkPHP路由详解
2015/07/27 PHP
thinkPHP查询方式小结
2016/01/09 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
JS类库Bindows1.3中的内存释放方式分析
2007/03/08 Javascript
响应鼠标变换表格背景或者颜色的代码
2009/03/30 Javascript
Javascript中的相等与不等运算
2010/04/25 Javascript
文本框根据输入内容自适应高度的代码
2011/10/24 Javascript
验证手机号码的JS方法分享
2013/09/10 Javascript
触屏中的JavaScript事件分析
2015/02/06 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
2015/08/07 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
jQuery 局部div刷新和全局刷新方法总结
2016/10/05 Javascript
微信小程序 地图定位简单实例
2016/10/14 Javascript
js轮播图的插件化封装详解
2017/07/17 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
详解微信小程序之一键复制到剪切板
2019/04/24 Javascript
通过实例了解js函数中参数的传递
2019/06/15 Javascript
JS正则表达式验证端口范围(0-65535)
2020/01/06 Javascript
Vuejs通过拖动改变元素宽度实现自适应
2020/09/02 Javascript
Python实现获取磁盘剩余空间的2种方法
2017/06/07 Python
django框架自定义用户表操作示例
2018/08/07 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
selenium自动化测试入门实战
2020/12/21 Python
实例讲解使用HTML5 Canvas绘制阴影效果的方法
2016/03/25 HTML / CSS
旅游项目开发策划书
2014/01/18 职场文书
财务科科长岗位职责
2014/03/10 职场文书
居委会四风问题个人对照检查材料
2014/09/25 职场文书
2015世界地球日活动总结
2015/02/09 职场文书
英语辞职信怎么写
2015/02/28 职场文书
堂吉诃德读书笔记
2015/06/30 职场文书
sass 常用备忘案例详解
2021/09/15 HTML / CSS
quickjs 封装 JavaScript 沙箱详情
2021/11/02 Javascript