博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python: collections.nametuple()--映射名称到序列元素
阅读量:6659 次
发布时间:2019-06-25

本文共 1983 字,大约阅读时间需要 6 分钟。

问题:  通过下标访问列表或者元组中元素

answer: collections.namedtuple()通过使用元组对象来解决这个问题

这个函数实际上是一个返回Python中标准元组类型子类的一个工厂方法,需要传递一个类型名和字段给它,然后它返回一个类,可以初始化一个类,为定义的字段传递值。

eg1:

1.

>>> from collections import namedtuple

>>> Subscriber = namedtuple('Subscriber', ['addr', 'joined'])
>>> sub = Subscriber('jonesy@example.com', '2012-10-19')
>>> sub
Subscriber(addr='jonesy@example.com', joined='2012-10-19')
>>> sub.addr
'jonesy@example.com'
>>> sub.joined
'2012-10-19'

 

2.支持索引和解压

>>> addr, joined = sub
>>> addr
'jonesy@example.com'
>>> joined
'2012-10-19'

eg2:

1.命名元组的一个用途从下标操作中解脱出来

>>>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

2.命名元组的另一个用途是作为字典的替代。

字典存储需要更多的内存空间,如果需要构建一个非常大的包含字典的数据结构,使用元组会更加高效,需要注意的是命名元组不可更改

>>> s = Stock('ACME', 100, 123.45)

>>> s
Stock(name='ACME', shares=100, price=123.45)
>>> s.shares = 75
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute

 

如果真的需要改变命名元组的属性,可以使用命名元组实例的_replace()方法,它会创建一个全新的命名元组并将对应的字段用新的值取代

>>> s = s._replace(shares=75)

>>> s
Stock(name='ACME', shares=75, price=123.45)

它是一个非常方便的填充数据的方法。你可以先创建一个包含缺省值的原型元组,然后使用replace() 方法创建新的值被更新过的实例。比如:

>>>from collections import namedtuple
>>>Stock = namedtuple('Stock', ['name', 'shares', 'price', 'date', 'time'])
stock_prototype = Stock('', 0, 0.0, None, None)
>>>def dict_to_stock(s):
...  return stock_prototype._replace(**s)

下面是它的使用方法:
>>> a = {'name': 'ACME', 'shares': 100, 'price': 123.45}
>>> dict_to_stock(a)
Stock(name='ACME', shares=100, price=123.45, date=None, time=None)
>>> b = {'name': 'ACME', 'shares': 100, 'price': 123.45, 'date': '12/17/2012'}
>>> dict_to_stock(b)
Stock(name='ACME', shares=100, price=123.45, date='12/17/2012', time=None)

如果目标是定义一个需要更新很多实例属性的高效数据结构,命名元组不是最佳选择,这时候考虑定义一个__slots__方法的类

 

转载于:https://www.cnblogs.com/baxianhua/p/8297539.html

你可能感兴趣的文章
我的友情链接
查看>>
Ubuntu Mate:扩展存储到整张SD卡
查看>>
es学习5-slowlog
查看>>
nf_conntrack: table full, dropping packet
查看>>
Linux的五个查找命令:find,locate,whereis,which,type
查看>>
读写者锁与生产者/消费者模式
查看>>
关于python中的if __name__=='__main__'语句问题
查看>>
线程组
查看>>
涉密数据的处理
查看>>
python简介
查看>>
python字典开发三级菜单
查看>>
.net Framework下载地址
查看>>
深圳偶遇
查看>>
如何有效地记录 Java SQL 日志?
查看>>
学习Linux决心书
查看>>
Java本地文件操作(五)遍历文件夹
查看>>
BGP学习笔记
查看>>
linux 磁盘分区(一)
查看>>
在虚拟机中的域环境下批量安装部署软件(第三节)
查看>>
java基础(jdbc上)
查看>>