zoukankan      html  css  js  c++  java
  • Python: collections.nametuple()--映射名称到序列元素

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

    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__方法的类

  • 相关阅读:
    ExtJs2.0学习系列(2)Ext.Panel
    ExtJs2.0学习系列(1)Ext.MessageBox
    ExtJs2.0学习系列(3)Ext.Window
    微软挖IBM公司Lotus合伙人 炫耀协同软件优势
    Vector
    H264和MPEG4起始码(startcode)
    Android有趣的全透明效果Activity及Dialog的全透明(附android系统自带图标大全)
    C++中的vector使用范例
    关于Vector
    用vector取代Cstyle的数组
  • 原文地址:https://www.cnblogs.com/baxianhua/p/8297539.html
Copyright © 2011-2022 走看看