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开发常用的一些开源Package分享
Feb 14 Python
Python设计模式编程中解释器模式的简单程序示例分享
Mar 02 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
Apr 19 Python
python定时利用QQ邮件发送天气预报的实例
Nov 17 Python
Python进阶之递归函数的用法及其示例
Jan 31 Python
对python 各种删除文件失败的处理方式分享
Apr 24 Python
利用ctypes获取numpy数组的指针方法
Feb 12 Python
python实现手机销售管理系统
Mar 19 Python
python读取ini配置的类封装代码实例
Jan 08 Python
关于python 的legend图例,参数使用说明
Apr 17 Python
keras 简单 lstm实例(基于one-hot编码)
Jul 02 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
Dec 09 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
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
PHP获取当前日期和时间及格式化方法参数
2015/05/11 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
2019/10/24 PHP
json格式的时间显示为正常年月日的方法
2013/09/08 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
2014/03/19 Javascript
JavaScript验证图片类型(扩展名)的函数分享
2014/05/05 Javascript
jQuery 常用代码集锦(必看篇)
2016/05/16 Javascript
JS实现电话号码的字母组合算法示例
2019/02/26 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
2019/07/08 Javascript
vue总线机制(bus)知识点详解
2020/05/10 Javascript
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
Python打包文件夹的方法小结(zip,tar,tar.gz等)
2016/09/18 Python
Python使用re模块实现信息筛选的方法
2018/04/29 Python
Python中创建二维数组
2018/10/17 Python
详解python中TCP协议中的粘包问题
2019/03/22 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
Python中使用gflags实例及原理解析
2019/12/13 Python
给Python学习者的文件读写指南(含基础与进阶)
2020/01/29 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
2020/02/15 Python
python怎么删除缓存文件
2020/07/19 Python
Python3使用 GitLab API 进行批量合并分支
2020/10/15 Python
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
韩国商务邀请函
2014/01/14 职场文书
消防器材管理制度
2014/01/28 职场文书
经典广告词大全
2014/03/14 职场文书
安全演讲稿大全
2014/05/09 职场文书
孝老爱亲模范事迹材料
2014/05/25 职场文书
安全承诺书
2015/01/19 职场文书
不同意离婚答辩状
2015/05/22 职场文书
Apache压力测试工具的安装使用
2021/03/31 Servers
vite+vue3.0+ts+element-plus快速搭建项目的实现
2021/06/24 Vue.js
MySQL数据库超时设置配置的方法实例
2021/10/15 MySQL
前端JavaScript大管家 package.json
2021/11/02 Javascript
Mysql中一千万条数据怎么快速查询
2021/12/06 MySQL
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js