在我看来,标准库namedtuple类是一种使元组更像字典的方法。如何命名元组比较字典?什么时候使用它们?它们是否适用于非哈希类型?


元组是不可变的,无论是否命名。Namedtuple只是通过使用名称而不是索引使访问更加方便。您只能为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)

并且在__init__中设置属性后不更改它们,您可以使用

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

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

作为替代品。

当然,你可以创建一堆字典,在每个字典中使用相同的键,但假设你只使用有效的Python标识符作为键,并且不需要可变性,

mynamedtuple.fieldname

mydict['fieldname']

and

mynamedtuple = MyNamedTuple(firstvalue, secondvalue)

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

最后,命名元组是有序的,这与常规字典不同,因此您可以按照定义字段的顺序获取项,这与字典不同。