何时以及为什么我应该使用namedtuple而不是字典?

时间:2012-03-26 12:37:16

标签: python

  

可能重复:
  What are “named tuples” in Python?

应该使用namedtuple的情况是什么?

当我调查它时,它看起来像是一种让元组更像字典的方法。他们如何与字典相比?

只能为字典使用相同的字典类型吗?

2 个答案:

答案 0 :(得分:194)

dict中,只有键必须是可清除的,而不是值。 namedtuple没有密钥,因此可靠性不是问题。

然而,他们有更严格的限制 - 他们的关键等价物,“字段名称”,必须是字符串。

基本上,如果您要创建一组类的实例,如:

class Container:
    def __init__(self, name, date, foo, bar):
        self.name = name
        self.date = date
        self.foo = foo
        self.bar = bar

mycontainer = Container(name, date, foo, bar)
在<{1}}中设置后,

不会更改属性,您可以改为使用

__init__

作为替代品。

当然,您可以创建一堆Container = namedtuple('Container', ['name', 'date', 'foo', 'bar']) mycontainer = Container(name, date, foo, bar) ,其中每个都使用相同的键,但假设您只有有效的Python标识符作为键,并且不需要可变性,

dict

更漂亮
mynamedtuple.fieldname

mydict['fieldname']

更漂亮
mynamedtuple = MyNamedTuple(firstvalue, secondvalue)

最后,与常规mydict = {'fieldname': firstvalue, 'secondfield': secondvalue} 不同,namedtuple是有序的,因此您按照定义字段的顺序获取项目,而不是dict

答案 1 :(得分:34)

无论是否命名,元组都是不可变的。 namedtuple仅通过使用名称而不是索引来使访问更方便。您只能使用namedtuple的有效标识符,它不会执行任何哈希 - 它会生成新类型。