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删除本地目录下某一时间点之前创建的所有文件的实例
Dec 14 Python
python实现微信自动回复功能
Apr 11 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
Apr 19 Python
使用11行Python代码盗取了室友的U盘内容
Oct 23 Python
使用Python和Prometheus跟踪天气的使用方法
May 06 Python
Python 最强编辑器详细使用指南(PyCharm )
Sep 16 Python
Python读取表格类型文件代码实例
Feb 17 Python
使用pyplot.matshow()函数添加绘图标题
Jun 16 Python
浅谈Keras中shuffle和validation_split的顺序
Jun 19 Python
如何在scrapy中集成selenium爬取网页的方法
Nov 18 Python
Python扫描端口的实现
Jan 25 Python
Python pandas求方差和标准差的方法实例
Aug 04 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 cookis创建实现代码
2009/03/16 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
discuz加密解密函数使用方法和中文注释
2014/01/21 PHP
php生成过去100年下拉列表的方法
2015/07/20 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
2015/11/09 PHP
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
js数字输入框(包括最大值最小值限制和四舍五入)
2009/11/24 Javascript
js function使用心得
2010/05/10 Javascript
json数据处理技巧(字段带空格、增加字段、排序等等)
2013/06/14 Javascript
javascript实现倒计时(精确到秒)
2015/06/26 Javascript
js简单工厂模式用法实例
2015/06/30 Javascript
JS 调用微信扫一扫功能
2016/12/22 Javascript
Vue.js组件tab实现选项卡切换
2020/03/23 Javascript
JS奇技之利用scroll来监听resize详解
2017/06/15 Javascript
Angular 2父子组件数据传递之@Input和@Output详解(下)
2017/07/05 Javascript
微信小程序实现刷脸登录
2018/05/25 Javascript
Angular5集成eventbus的示例代码
2018/07/19 Javascript
vue vue-Router默认hash模式修改为history需要做的修改详解
2018/09/13 Javascript
vue实现条件叠加搜索的解决方法
2019/05/28 Javascript
vue学习笔记之作用域插槽实例分析
2020/02/01 Javascript
python爬虫实战之最简单的网页爬虫教程
2017/08/13 Python
python2.7无法使用pip的解决方法(安装easy_install)
2018/04/03 Python
PyQt QCombobox设置行高的方法
2019/06/20 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
对python中UDP,socket的使用详解
2019/08/22 Python
python实现视频压缩功能
2020/12/18 Python
施华洛世奇巴西官网:SWAROVSKI巴西
2019/12/03 全球购物
初中数学教学反思
2014/01/16 职场文书
蓝颜请假条
2014/04/11 职场文书
党员个人剖析材料
2014/09/30 职场文书
2014年财务个人工作总结
2014/12/08 职场文书
办公室主任岗位竞聘书
2015/09/15 职场文书
党章学习心得体会2016
2016/01/14 职场文书
MySQL入门命令之函数-单行函数-流程控制函数
2021/04/05 MySQL
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis
python如何读取和存储dict()与.json格式文件
2022/06/25 Python