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连接mysql数据库示例(做增删改操作)
Dec 31 Python
python连接远程ftp服务器并列出目录下文件的方法
Apr 01 Python
Django与遗留的数据库整合的方法指南
Jul 24 Python
Python实现输出程序执行进度百分比的方法
Sep 16 Python
Python3多线程爬虫实例讲解代码
Jan 05 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
Jun 13 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
Sep 04 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
Jul 11 Python
pygame实现贪吃蛇游戏(下)
Oct 29 Python
python实现门限回归方式
Feb 29 Python
python 调整图片亮度的示例
Dec 03 Python
jupyter notebook指定启动目录的方法
Mar 02 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中获取内网用户MAC地址(WINDOWS/linux)的实现代码
2011/08/11 PHP
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
PHP中的事务使用实例
2015/05/26 PHP
PHP读取word文档的方法分析【基于COM组件】
2017/08/01 PHP
不错的asp中显示新闻的功能
2006/10/13 Javascript
jquery的颜色选择插件实例代码
2008/10/02 Javascript
javascript offsetX与layerX区别
2010/03/12 Javascript
基于jquery的无刷新分页技术
2011/06/11 Javascript
js里怎么取select标签里的值并修改
2012/12/10 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
jquery SweetAlert插件实现响应式提示框
2015/08/18 Javascript
JavaScript计算值然后把值嵌入到html中的实现方法
2016/10/29 Javascript
前端开发不得不知的10个最佳ES6特性
2017/08/30 Javascript
jquery 键盘事件的使用方法详解
2017/09/13 jQuery
详解Vue单元测试Karma+Mocha学习笔记
2018/01/31 Javascript
JS实现区分中英文并统计字符个数的方法示例
2018/06/09 Javascript
vue使用axios上传文件(FormData)的方法
2019/04/14 Javascript
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
vue+echarts实现中国地图流动效果(步骤详解)
2021/01/27 Vue.js
Python实现信用卡系统(支持购物、转账、存取钱)
2016/06/24 Python
基于Python实现的ID3决策树功能示例
2018/01/02 Python
Python数据类型之Set集合实例详解
2019/05/07 Python
Python代码实现http/https代理服务器的脚本
2019/08/12 Python
Python 实现的 Google 批量翻译功能
2019/08/26 Python
matplotlib bar()实现百分比堆积柱状图
2021/02/24 Python
巧用CSS3的calc()宽度计算做响应模式布局的方法
2018/03/22 HTML / CSS
精选鞋类、服装和配饰的全球领先目的地:Bodega
2021/02/27 全球购物
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
实习评语大全
2014/04/26 职场文书
人力资源管理毕业求职信
2014/08/05 职场文书
四风问题民主生活会对照检查材料思想汇报
2014/09/27 职场文书
个人合伙协议书范本
2014/10/14 职场文书
团组织推优材料
2014/12/29 职场文书
python学习之panda数据分析核心支持库
2021/05/07 Python
Java 泛型详解(超详细的java泛型方法解析)
2021/07/02 Java/Android