关于python:什么时候和为什么我应该使用name-duple而不是dictionary?

When and why should I use a namedtuple instead of a dictionary?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What are “named tuples” in Python?

在什么情况下应该使用一个NamedDuple?

当我研究它时,它看起来像一种使元组更像字典的方法。它们与词典相比如何?

只能将字典的相同哈希类型用于NamedDuples吗?


dicts中,只有键必须是可哈希的,而不是值。namedtuple没有密钥,因此哈希性不是问题。

但是,它们有一个更严格的限制——它们的键等价物"字段名"必须是字符串。

基本上,如果要创建类的一系列实例,例如:

1
2
3
4
5
6
7
8
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)

__init__中设置属性后不更改属性,可以使用

1
2
3
Container = namedtuple('Container', ['name', 'date', 'foo', 'bar'])

mycontainer = Container(name, date, foo, bar)

作为替代品。

当然,您可以创建一组dict,在其中每个密钥中使用相同的密钥,但是假设您将只有有效的python标识符作为密钥,并且不需要可变性,

1
mynamedtuple.fieldname

比…更漂亮

1
mydict['fieldname']

1
mynamedtuple = MyNamedTuple(firstvalue, secondvalue)

比…更漂亮

1
mydict = {'fieldname': firstvalue, 'secondfield': secondvalue}

最后,与常规的dicts不同,namedtuples是有序的,因此您可以按照定义字段的顺序获得项目,而不像dict那样。


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