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操作gmail实例
Jan 14 Python
Python set常用操作函数集锦
Nov 15 Python
利用Django内置的认证视图实现用户密码重置功能详解
Nov 24 Python
详解Python在七牛云平台的应用(一)
Dec 05 Python
Python异常的检测和处理方法
Oct 26 Python
详解Python循环作用域与闭包
Mar 21 Python
pybind11在Windows下的使用教程
Jul 04 Python
使用Python将Exception异常错误堆栈信息写入日志文件
Apr 08 Python
jupyter实现重新加载模块
Apr 16 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
May 21 Python
python+requests接口自动化框架的实现
Aug 31 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
Jan 05 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
十大催泪虐心动漫电影,有几部你还没看
2020/03/04 日漫
php环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
2006/11/17 PHP
php+mysql实现无限级分类 | 树型显示分类关系
2006/11/19 PHP
PHP COOKIE及时生效的方法介绍
2014/02/14 PHP
PHP排序算法类实例
2015/06/17 PHP
thinkphp jquery实现图片上传和预览效果
2020/07/22 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
Mac系统下搭建Nginx+php-fpm实例讲解
2020/12/15 PHP
jQuery最佳实践完整篇
2011/08/20 Javascript
十个迅速提升JQuery性能让你的JQuery跑得更快
2012/12/10 Javascript
JavaScript实现表格排序方法
2013/06/14 Javascript
将list转换为json失败的原因
2013/12/17 Javascript
jQuery取id有.的值的方法
2014/05/21 Javascript
Js实现网页键盘控制翻页的方法
2014/10/30 Javascript
关于Javascript加载执行优化的研究报告
2014/12/16 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
jQuery实现的导航下拉菜单效果示例
2016/09/05 Javascript
parabola.js抛物线与加入购物车效果的示例代码
2017/10/25 Javascript
vue项目部署到Apache服务器中遇到的问题解决
2018/08/24 Javascript
Vue函数式组件-你值得拥有
2019/05/09 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
[41:20]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS DK
2014/05/26 DOTA
Python json 错误xx is not JSON serializable解决办法
2017/03/15 Python
Python创建二维数组实例(关于list的一个小坑)
2017/11/07 Python
python+selenium实现京东自动登录及秒杀功能
2017/11/18 Python
浅析Python pandas模块输出每行中间省略号问题
2018/07/03 Python
python函数与方法的区别总结
2019/06/23 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
Python脚本实现监听服务器的思路代码详解
2020/05/28 Python
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
采用冷却技术的超自然舒适度:GhostBed床垫
2018/09/18 全球购物
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
行政副总岗位职责
2014/02/23 职场文书
银行职员自我鉴定
2014/04/20 职场文书