257

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?

1

2 Answers 2

289

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.

Sign up to request clarification or add additional context in comments.

7 Comments

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/524660721968107521
One more thing to note is that the named tuple can also be initialized as mynamedtuple = MyNamedTuple(fieldname=firstvalue, secondfield=secondvalue)
You can make the instantiatiation even prettier/simpler with Container = namedtuple('Container', 'name date foo bar')
If you need more flexibility, attrs is an interesting alternative to namedtuple.
If you're using Python 3.7 or CPython 3.6 dicts are insertion ordered.
|
51

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.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.