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?
- 2Take a look at this question - stackoverflow.com/questions/2970608/…ronakg– ronakg2012-03-26 12:45:41 +00:00Commented Mar 26, 2012 at 12:45
2 Answers
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.
7 Comments
mynamedtuple = MyNamedTuple(fieldname=firstvalue, secondfield=secondvalue)Container = namedtuple('Container', 'name date foo bar')dicts are insertion ordered.