When and why should I use a namedtuple instead of a dictionary? [duplicate]
Asked Answered
D

2

243

The standard library namedtuple class looks to me like a way to make tuples more like dictionaries. How do namedtuples compare to dicts? When should we use them? Do they work with non-hashable types?

Decongestant answered 26/3, 2012 at 12:37 Comment(2)
Take a look at this question - #2971108Ashlan
^-- agreed: 2970608 has named tuple FAQs and this one asks for comparison to dict.Shewchuk
S
279

In dicts, only the keys have to be hashable, not the values. namedtuples 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 dicts 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, namedtuples are ordered, unlike regular dicts, so you get the items in the order you defined the fields, unlike a dict.

Styria answered 26/3, 2012 at 12:49 Comment(7)
Also, quoting Raymondh: "Instances of named tuples use no more space than regular tuples. The field name properties are stored in the namedtuple class." twitter.com/raymondh/status/524660721968107521Mercorr
One more thing to note is that the named tuple can also be initialized as mynamedtuple = MyNamedTuple(fieldname=firstvalue, secondfield=secondvalue)Seasoning
You can make the instantiatiation even prettier/simpler with Container = namedtuple('Container', 'name date foo bar')Culpepper
If you need more flexibility, attrs is an interesting alternative to namedtuple.Arrive
If you're using Python 3.7 or CPython 3.6 dicts are insertion ordered.Annihilation
@Boris Good info, but still different from field definition ordering and in many situations just as unknown as random ordering.Styria
NamedTuples take advantage of attribute autocompletion provided by many IDEs, since they use attribute access rather than key lookup. No more checking parse_x_data() source code for a dict signature.Ley
D
49

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.

Dominic answered 26/3, 2012 at 12:47 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.