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 Web开发模板引擎优缺点总结
May 06 Python
Python中用Spark模块的使用教程
Apr 13 Python
Python打包可执行文件的方法详解
Sep 19 Python
python得到qq句柄,并显示在前台的方法
Oct 14 Python
基于Python实现定时自动给微信好友发送天气预报
Oct 25 Python
python执行CMD指令,并获取返回的方法
Dec 19 Python
python将pandas datarame保存为txt文件的实例
Feb 12 Python
python3获取url文件大小示例代码
Sep 18 Python
pytorch forward两个参数实例
Jan 17 Python
python实现交并比IOU教程
Apr 16 Python
深入理解Pytorch微调torchvision模型
Nov 11 Python
python人工智能human learn绘图可创建机器学习模型
Nov 23 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
怎么样可以把 phpinfo()屏蔽掉?
2006/11/24 PHP
GBK的页面输出JSON格式的php函数
2010/02/16 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
使用JQuery进行跨域请求
2010/01/25 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
Javascript 拖拽的一些高级的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
JavaScript使用RegExp进行正则匹配的方法
2015/07/11 Javascript
js绘制圆形和矩形的方法
2015/08/05 Javascript
JSON字符串转换JSONObject和JSONArray的方法
2016/06/03 Javascript
利用JQuery实现datatables插件的增加和删除行功能
2017/01/06 Javascript
jQuery实现菜单栏导航效果
2017/08/15 jQuery
JavaScript 正则命名分组【推荐】
2018/06/07 Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
2018/11/12 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
2020/07/20 Javascript
Vue中强制组件重新渲染的正确方法
2021/01/03 Vue.js
[26:21]浴火之凤-TI4世界冠军Newbee战队纪录片
2014/08/07 DOTA
Python编程中字符串和列表的基本知识讲解
2015/10/14 Python
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
用python记录运行pid,并在需要时kill掉它们的实例
2017/01/16 Python
对python 自定义协议的方法详解
2019/02/13 Python
python将excel转换为csv的代码方法总结
2019/07/03 Python
python实现的发邮件功能示例
2019/09/11 Python
Python基础之变量基本用法与进阶详解
2020/01/03 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
浅谈matplotlib默认字体设置探索
2021/02/03 Python
通过CSS3的object-fit来调整图片适配尺寸的技巧简介
2016/02/27 HTML / CSS
HTML5 script元素async、defer异步加载使用介绍
2013/08/23 HTML / CSS
吃透移动端 Html5 响应式布局
2019/12/16 HTML / CSS
求职信写作要突出重点
2014/01/01 职场文书
车贷收入证明范本
2014/09/14 职场文书
2016春节放假通知范文
2015/08/18 职场文书
关于感恩的歌曲整理(8首)
2019/08/14 职场文书
spring boot中nativeQuery的用法
2021/07/26 Java/Android