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 27 Python
Python脚本实现虾米网签到功能
Apr 12 Python
python rsa 加密解密
Mar 20 Python
python爬虫入门教程--利用requests构建知乎API(三)
May 25 Python
Django实现一对多表模型的跨表查询方法
Dec 18 Python
python3实现点餐系统
Jan 24 Python
Python实现的微信红包提醒功能示例
Aug 22 Python
浅析PEP570新语法: 只接受位置参数
Oct 15 Python
torch 中各种图像格式转换的实现方法
Dec 26 Python
windows下Pycharm安装opencv的多种方法
Mar 05 Python
matplotlib之属性组合包(cycler)的使用
Feb 24 Python
Python基础之元类详解
Apr 29 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实现文件上传二法
2006/10/09 PHP
火车头采集器3.0采集图文教程
2007/03/17 PHP
Codeigniter生成Excel文档的简单方法
2014/06/12 PHP
php下载文件超时时间的设置方法
2016/10/06 PHP
php实现购物车产品删除功能(2)
2020/07/23 PHP
PHP校验15位和18位身份证号的类封装
2018/11/07 PHP
js中eval详解
2012/03/30 Javascript
网页右下角弹出窗体实现代码
2014/06/05 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
2016/07/28 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
详解axios在vue中的简单配置与使用
2017/05/10 Javascript
开发一个Parcel-vue脚手架工具(详细步骤)
2018/09/22 Javascript
基于Koa2写个脚手架模拟接口服务的方法
2018/11/27 Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
2020/07/22 Javascript
对于Python中线程问题的简单讲解
2015/04/03 Python
分析Python编程时利用wxPython来支持多线程的方法
2015/04/07 Python
用Python的Django框架编写从Google Adsense中获得报表的应用
2015/04/17 Python
python实现逆波兰计算表达式实例详解
2015/05/06 Python
详解Python的Django框架中的中间件
2015/07/24 Python
Python单例模式实例详解
2017/03/01 Python
Python中.py文件打包成exe可执行文件详解
2017/03/22 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
2018/02/22 Python
linux下安装python3和对应的pip环境教程详解
2019/07/01 Python
Python利用matplotlib做图中图及次坐标轴的实例
2019/07/08 Python
Python入门Anaconda和Pycharm的安装和配置详解
2019/07/16 Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
2020/05/13 Python
Python 操作 MySQL数据库
2020/09/18 Python
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
倡议书范文
2014/04/16 职场文书
戒毒悔改检讨书
2014/09/21 职场文书
教师党员批评与自我批评
2014/10/15 职场文书
客房服务员岗位职责
2015/02/09 职场文书
2015年幼儿园师德师风建设工作总结
2015/10/23 职场文书
python 常用的异步框架汇总整理
2021/06/18 Python
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
2021/10/16 Python
css中有哪些方式可以隐藏页面元素及区别
2022/06/16 HTML / CSS