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中处理unchecked未捕获异常实例
Jan 17 Python
利用Python如何生成随机密码
Apr 20 Python
浅谈pyhton学习中出现的各种问题(新手必看)
May 17 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
Feb 18 Python
python使用筛选法计算小于给定数字的所有素数
Mar 19 Python
Python3爬虫使用Fidder实现APP爬取示例
Nov 27 Python
Django中如何使用sass的方法步骤
Jul 09 Python
python 获取sqlite3数据库的表名和表字段名的实例
Jul 17 Python
Django中间件基础用法详解
Jul 18 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
pygame实现飞机大战
Mar 11 Python
python实现梯度法 python最速下降法
Mar 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通过正则表达式下载图片到本地的实现代码
2011/09/19 PHP
php异常处理技术,顶级异常处理器
2012/06/13 PHP
php常用字符串比较函数实例汇总
2014/11/24 PHP
php随机生成数字字母组合的方法
2015/03/18 PHP
Javascript 面向对象 继承
2010/05/13 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
JQuery Tips相关(1)----关于$.Ready()
2014/08/14 Javascript
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
分享JavaScript与Java中MD5使用两个例子
2015/12/23 Javascript
JavaScript学习笔记--常用的互动方法
2016/12/07 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
jQuery实现的两种简单弹窗效果示例
2018/04/18 jQuery
vue中的router-view组件的使用教程
2018/10/23 Javascript
vue请求服务器数据后绑定不上的解决方法
2019/10/30 Javascript
DWR内存兼容及无法调用问题解决方案
2020/10/16 Javascript
[43:57]LGD vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python条件和循环的使用方法
2013/11/01 Python
python字符串加密解密的三种方法分享(base64 win32com)
2014/01/19 Python
Python自定义主从分布式架构实例分析
2016/09/19 Python
Python使用time模块实现指定时间触发器示例
2017/05/18 Python
完美解决安装完tensorflow后pip无法使用的问题
2018/06/11 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
YUV转为jpg图像的实现
2019/12/09 Python
Python如何使用OS模块调用cmd
2020/02/27 Python
使用HTML5 Canvas为图片填充颜色和纹理的教程
2016/03/21 HTML / CSS
美国零售商店:Blue&Cream
2017/04/07 全球购物
医学检验专业大学生求职信
2013/11/18 职场文书
出国考察邀请函
2014/01/21 职场文书
校运会入场式解说词
2014/02/10 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
消费者理赔投诉书
2015/07/02 职场文书
SQL 窗口函数实现高效分页查询的案例分析
2021/05/21 SQL Server
Python超详细分步解析随机漫步
2022/03/17 Python
唤醒紫霞仙子,携手再游三界!大话手游X《大话西游》电影合作专属剧情任务
2022/04/03 其他游戏
Windows server 2016服务器基本设置
2022/08/14 Servers
css之clearfix的用法深入理解(必看篇)
2023/05/21 HTML / CSS