collections.namedtuple 将名称映射到序列的元素中

问题:通过位置(索引,或下标)来访问列表或元组的,但有时候这会使代码变得有些难以阅读。我们希望可以通过名称来访问元素
解决方法:collections.namedtuple() –命名元组, 只增加了极小的开销就提供了这些便利。

它是一个工厂方法,返回的是Python中标准元组类型的子类。我们提供给它一个类型名称以及相应的字段, 它就返回一个可实例化的类、为你定义好的字段传入值等。

作用:

1、命名元组的主要作用在于将代码同它所控制的元素位置间解耦;
2、namedtuple的一种可能用法是作为字典的替代,后者需要更多的空间来存储;如果要构建设计字典的大型数据结构,使用namedtuple会更加高效;
3、可以用来数据库的返回字段上,那么就可以通过.属性方式访问;

注意:

1、与字典不同的是,namedtuple是不可变的;
2、如果需要修改任何属性,可以通过使用namedtuple实例的_replace()方法来实现;该方法会创建一个全新的命名元组,并对相应的值做替换;
3、_replace()方法可以填充具有可选或缺失字段的命名元组

使用示例
import collections
Subscriber = collections.namedtuple('Subscriber', ['addr', 'joined'])
sub = Subscriber(addr='xiaoming@qq.com', joined='2018-09-29')
sub.addr
Out[4]: 'xiaoming@qq.com'
sub.joined
Out[5]: '2018-09-29'

1、命名元组可与普通的元组互换,而且支持所有所有普通元组所支持的操作,如索引和解包

addr, joined = sub  # 解包
addr
Out[7]: 'xiaoming@qq.com'
joined
Out[8]: '2018-09-29'

2、namedtuple是不可改变的

Stock = collections.namedtuple('Stock', ['name', 'shares', 'price'])
s = Stock('ACME', 100, 123.45)
s
Out[11]: Stock(name='ACME', shares=100, price=123.45)
s.shares = 20
Traceback (most recent call last):
  AttributeError: can't set attribute

3、使用实例的_replace()方法,来更改属性值(创建全新的命名元组)

s = s._replace(shares=1)
s
Out[14]: Stock(name='ACME', shares=1, price=123.45)

4、_replace()方法可以填充具有可选或缺失字段的命名元组

Stock = collections.namedtuple('Stock', ['name', 'shares', 'price', 'date', 'time'])
stock_prototype = Stock('', 0, 9.0, None, None)

def dict_to_stock(s):
    return stock_prototype._replace(**s)  # 字典解包

a = {'name': 'ACME', 'shares': 100, 'price': 12.00}
dict_to_stock(a)
Out[18]: Stock(name='ACME', shares=100, price=12.0, date=None, time=None)

b = {'name': 'ACME', 'shares': 100, 'price': 12.00, 'date': '2018-09-29'}
dict_to_stock(b)
Out[20]: Stock(name='ACME', shares=100, price=12.0, date='2018-09-29', time=None)
    原文作者:cook__
    原文地址: https://www.jianshu.com/p/317f192f4c6f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞