When and why should I use a namedtuple instead of a dictionary? [duplicate]
Possible Duplicate:
What are “named tuples” in Python?
What is the situation where a namedtuple should be used?
When I looked into it, it looked like a way to make tuples more like dictionaries. How do they compare to dictionaries?
Can only the same hashable types for dictionaries be used for namedtuples?
In dict
s, only the keys have to be hashable, not the values. namedtuple
s don't have keys, so hashability isn't an issue.
However, they have a more stringent restriction -- their key-equivalents, "field names", have to be strings.
Basically, if you were going to create a bunch of instances of a class like:
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)
and not change the attributes after you set them in __init__
, you could instead use
Container = namedtuple('Container', ['name', 'date', 'foo', 'bar'])
mycontainer = Container(name, date, foo, bar)
as a replacement.
Of course, you could create a bunch of dict
s where you used the same keys in each one, but assuming you will have only valid Python identifiers as keys and don't need mutability,
mynamedtuple.fieldname
is prettier than
mydict['fieldname']
and
mynamedtuple = MyNamedTuple(firstvalue, secondvalue)
is prettier than
mydict = {'fieldname': firstvalue, 'secondfield': secondvalue}
Finally, namedtuple
s are ordered, unlike regular dict
s, so you get the items in the order you defined the fields, unlike a dict
.
Tuples are immutable, whether named or not. namedtuple
only makes the access more convenient, by using names instead of indices. You can only use valid identifiers for namedtuple
, it doesn't perform any hashing — it generates a new type instead.