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批量下载图片的三种方法
Apr 22 Python
Python备份目录及目录下的全部内容的实现方法
Jun 12 Python
Python删除Java源文件中全部注释的实现方法
Aug 30 Python
MySQL适配器PyMySQL详解
Sep 20 Python
PyTorch上实现卷积神经网络CNN的方法
Apr 28 Python
对Python3中的print函数以及与python2的对比分析
May 02 Python
Python中作用域的深入讲解
Dec 10 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
Aug 06 Python
pycharm工具连接mysql数据库失败问题
Apr 01 Python
解决python对齐错误的方法
Jul 16 Python
Django中和时区相关的安全问题详解
Oct 12 Python
Python中常见的导入方式总结
May 06 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
SMARTY学习手记
2007/01/04 PHP
Zend Guard一些常见问题解答
2008/09/11 PHP
PHP return语句另类用法不止是在函数中
2014/09/17 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
PHP 与 UTF-8 的最佳实践详细介绍
2017/01/04 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
PHP封装的分页类与简单用法示例
2019/02/25 PHP
PHP大文件切割上传并带进度条功能示例
2019/07/01 PHP
ASP小贴士/ASP Tips javascript tips可以当桌面
2009/12/10 Javascript
JS获取屏幕高度的简单实现代码
2016/05/24 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
2016/09/23 Javascript
详解为Angular.js内置$http服务添加拦截器的方法
2016/12/20 Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
2017/01/23 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
2017/06/22 Javascript
浅谈关于.vue文件中style的scoped属性
2017/08/19 Javascript
vue-loader中引入模板预处理器的实现
2019/09/04 Javascript
vue实现表格过滤功能
2019/09/27 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
2020/07/23 Javascript
JavaScript实现刮刮乐效果
2020/11/01 Javascript
Python中使用不同编码读写txt文件详解
2015/05/28 Python
Python探索之自定义实现线程池
2017/10/27 Python
python和pygame实现简单俄罗斯方块游戏
2021/02/19 Python
Python实现的多叉树寻找最短路径算法示例
2018/07/30 Python
Python如何访问字符串中的值
2020/02/09 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
2021/02/02 Python
CSS3 linear-gradient线性渐变生成加号和减号的方法
2017/11/21 HTML / CSS
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
canvas中普通动效与粒子动效的实现代码示例
2019/01/03 HTML / CSS
中国首家奢侈品O2O网购平台:第五大道奢侈品网
2017/12/14 全球购物
银行会计业务的个人自我评价
2013/11/02 职场文书
导游欢送词
2015/01/31 职场文书
2015年司法局工作总结
2015/05/22 职场文书
活动宣传稿范文
2015/07/23 职场文书
Python制作一个随机抽奖小工具的实现
2021/07/07 Python
分布式Redis Cluster集群搭建与Redis基本用法
2022/02/24 Redis