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 自动安装 Rising 杀毒软件
Apr 24 Python
python3.3教程之模拟百度登陆代码分享
Jan 16 Python
python中使用xlrd、xlwt操作excel表格详解
Jan 29 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
Nov 16 Python
Python requests发送post请求的一些疑点
May 20 Python
使用Python自动化破解自定义字体混淆信息的方法实例
Feb 13 Python
对python 多线程中的守护线程与join的用法详解
Feb 18 Python
Python中zip()函数的解释和可视化(实例详解)
Feb 16 Python
在python中实现求输出1-3+5-7+9-......101的和
Apr 02 Python
基于python检查矩阵计算结果
May 21 Python
Python批量修改xml的坐标值全部转为整数的实例代码
Nov 26 Python
Python如何快速找到多个字典中的公共键(key)
Apr 29 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 download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
深入array multisort排序原理的详解
2013/06/18 PHP
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
2019/03/22 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
Javascript 读书笔记索引贴
2010/01/11 Javascript
理解Javascript_12_执行模型浅析
2010/10/18 Javascript
jquery属性过滤选择器使用示例
2013/06/18 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
javascript数组输出的两种方式
2015/01/13 Javascript
js判断主流浏览器类型和版本号的简单实现代码
2016/05/26 Javascript
Jquery on方法绑定事件后执行多次的解决方法
2016/06/02 Javascript
Vue加载json文件的方法简单示例
2019/01/28 Javascript
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
python解决网站的反爬虫策略总结
2016/10/26 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
Python 从一个文件中调用另一个文件的类方法
2019/01/10 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
python3.4 将16进制转成字符串的实例
2019/06/12 Python
Python使用qrcode二维码库生成二维码方法详解
2020/02/17 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
pyqt5实现井字棋的示例代码
2020/12/07 Python
python 用pandas实现数据透视表功能
2020/12/21 Python
Pycharm 如何一键加引号的方法步骤
2021/02/05 Python
泰国第一在线超市:Tops
2021/02/13 全球购物
请解释在new与override的区别
2012/10/29 面试题
上海期货面试题
2014/01/31 面试题
是否可以从一个static方法内部发出对非static方法的调用?
2014/08/18 面试题
偷看我的初中毕业鉴定
2014/01/29 职场文书
年会主持词结束语
2014/03/27 职场文书
岗位说明书范文
2014/05/07 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
2014年城市管理工作总结
2014/12/02 职场文书
先进班集体事迹材料
2014/12/25 职场文书
离婚承诺书格式范文
2015/05/04 职场文书
电子表的操作介绍说明书
2019/10/28 职场文书