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实现排序算法
Feb 14 Python
详解tensorflow训练自己的数据集实现CNN图像分类
Feb 07 Python
Python(Django)项目与Apache的管理交互的方法
May 16 Python
Python设计模式之策略模式实例详解
Jan 21 Python
Python爬虫:将headers请求头字符串转为字典的方法
Aug 21 Python
Python绘制股票移动均线的实例
Aug 24 Python
Python爬取知乎图片代码实现解析
Sep 17 Python
Python传递参数的多种方式(小结)
Sep 18 Python
Python unittest单元测试框架及断言方法
Apr 15 Python
python eventlet绿化和patch原理
Nov 21 Python
python将下载到本地m3u8视频合成MP4的代码详解
Nov 24 Python
使用Python拟合函数曲线
Apr 14 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
无线电的诞生过程
2021/03/01 无线电
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
2014/07/24 PHP
php similar_text()函数的定义和用法
2016/05/12 PHP
javascript函数定义的几种区别小结
2014/01/06 Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
2014/04/23 Javascript
浅谈javascript中call()、apply()、bind()的用法
2015/04/20 Javascript
jQuery实现鼠标点击弹出渐变层的方法
2015/07/09 Javascript
JavaScript正则替换HTML标签功能示例
2017/03/02 Javascript
微信小程序动态显示项目倒计时效果
2017/06/13 Javascript
关于vue.js组件数据流的问题
2017/07/26 Javascript
jQuery中 DOM节点操作方法大全
2017/10/12 jQuery
vue实现个人信息查看和密码修改功能
2018/05/06 Javascript
通过Nodejs搭建网站简单实现注册登录流程
2019/06/14 NodeJs
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
element中table高度自适应的实现
2020/10/21 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
Python 结巴分词实现关键词抽取分析
2017/10/21 Python
Win7 64位下python3.6.5安装配置图文教程
2020/10/27 Python
python 字典修改键(key)的几种方法
2018/08/10 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
2018/09/04 Python
python根据文章标题内容自动生成摘要的实例
2019/02/21 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
2020/01/14 Python
Python3操作MongoDB增册改查等方法详解
2020/02/10 Python
如何真正的了解python装饰器
2020/08/14 Python
HSRP的含义以及如何工作
2014/09/10 面试题
工程管理造价应届生求职信
2013/11/13 职场文书
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
《老山界》教学反思
2014/04/08 职场文书
大学生赌博检讨书
2014/09/22 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
2015年中个人总结范文
2015/03/10 职场文书
护理专业毕业自我鉴定
2019/08/12 职场文书
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript