python

超轻量级php框架startmvc

Python cookbook(数据结构与算法)将名称映射到序列元素中的方法

更新时间:2020-05-25 12:54:01 作者:startmvc
本文实例讲述了Python将名称映射到序列元素中的方法。分享给大家供大家参考,具体如下:

本文实例讲述了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 cookbook 数据结构与算法 名称 映射 序列元素
相关文章

JS中数据结构与算法---排序算法(Sort Algorithm)实例详解

每周一练 之 数据结构与算法(Stack)

JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例

JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】

JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】

JavaScript数据结构与算法之检索算法实例分析【顺序查找、最大最小值、自组织查询】

JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】

Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法

Python cookbook(数据结构与算法)从字典中提取子集的方法示例

Python cookbook(数据结构与算法)将名称映射到序列元素中的方法

Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例

Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例

Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例

Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例

Python cookbook(数据结构与算法)根据字段将记录分组操作示例

Python cookbook(数据结构与算法)筛选及提取序列中元素的方法

Python cookbook(数据结构与算法)将序列分解为单独变量的方法

Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例

Python cookbook(数据结构与算法)保存最后N个元素的方法

Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例