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实现简单ftp客户端的方法
Jun 28 Python
正确理解python中的关键字“with”与上下文管理器
Apr 21 Python
python决策树之CART分类回归树详解
Dec 20 Python
python画出三角形外接圆和内切圆的方法
Jan 25 Python
将tensorflow的ckpt模型存储为npy的实例
Jul 09 Python
python给微信好友定时推送消息的示例
Feb 20 Python
对python3 Serial 串口助手的接收读取数据方法详解
Jun 12 Python
Django 中自定义 Admin 样式与功能的实现方法
Jul 04 Python
详解python调用cmd命令三种方法
Jul 08 Python
python的移位操作实现详解
Aug 21 Python
Python 执行矩阵与线性代数运算
Aug 01 Python
python中random模块详解
Mar 01 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对象的串行化与反串行化
2016/01/24 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
ThinkPHP中图片按比例切割的代码实例
2019/03/08 PHP
jquery 插件之仿“卓越亚马逊”首页弹出菜单效果
2008/12/25 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
javascript实现链接单选效果的方法
2015/05/13 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
2016/04/05 Javascript
springMVC结合AjaxForm上传文件
2016/07/12 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
微信小程序 同步请求授权的详解
2017/08/04 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
2018/12/10 Javascript
Node爬取大批量文件的方法示例
2019/06/28 Javascript
Bootstrap简单实用的表单验证插件BootstrapValidator用法实例详解
2020/03/29 Javascript
vue实现购物车的监听
2020/04/20 Javascript
angula中使用iframe点击后不执行变更检测的问题
2020/05/10 Javascript
python检测远程服务器tcp端口的方法
2015/03/14 Python
python安装教程 Pycharm安装详细教程
2017/05/02 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
2017/12/21 Python
python中的字符串内部换行方法
2018/07/19 Python
python 循环读取txt文档 并转换成csv的方法
2018/10/26 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
python列表推导式操作解析
2019/11/26 Python
python爬虫学习笔记之pyquery模块基本用法详解
2020/04/09 Python
Pandas把dataframe或series转换成list的方法
2020/06/14 Python
Python字符串函数strip()原理及用法详解
2020/07/23 Python
HTML5 背景的显示区域实现
2020/07/09 HTML / CSS
上海微创软件面试题
2012/06/14 面试题
医药代表个人的求职信分享
2013/12/08 职场文书
2014年关于两会精神的心得体会
2014/03/17 职场文书
文明和谐家庭事迹材料
2014/05/18 职场文书
教师考核表个人总结
2015/02/12 职场文书
合同补充协议书
2016/03/24 职场文书
如何利用python和DOS获取wifi密码
2021/03/31 Python
python用海龟绘图写贪吃蛇游戏
2021/06/18 Python
详细聊聊关于Mysql联合查询的那些事儿
2021/10/24 MySQL