2012-03-26 5 views
113

Mögliche Duplizieren:
What are “named tuples” in Python?Wann und warum sollte ich ein Nametuple anstelle eines Wörterbuchs verwenden?

Was ist die Situation, in der ein namedtuple verwendet werden soll?

Wenn ich mir das anschaute, sah es so aus, als würden Tupel mehr wie Wörterbücher aussehen. Wie vergleichen sie sich mit Wörterbüchern?

Können für Nametuples nur dieselben hashbaren Typen für Wörterbücher verwendet werden?

+0

Werfen Sie einen Blick auf diese Frage - http://stackoverflow.com/questions/2970608/what-are-named-tuples-in-python – ronakg

+0

Dies ist kein Duplikat von [die oben genannte Frage] (https://stackoverflow.com/questions/2970608/what-are-named-tuples-in-python). Die beiden sind komplementär. – Dennis

Antwort

156

In dict s müssen nur die Schlüssel auswertbar sein, nicht die Werte. s haben keine Schlüssel, daher ist die Haschbarkeit kein Problem.

Sie haben jedoch eine strengere Einschränkung - ihre Schlüssel-Äquivalente, "Feldnamen", müssen Strings sein.

Grundsätzlich, wenn Sie eine Reihe von Instanzen einer Klasse wie schaffen wollten:

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) 

und nicht die Attribute ändern, nachdem Sie sie in __init__ gesetzt, Sie könnten stattdessen verwenden

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

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

als Ersatz.

Natürlich könnten Sie eine Reihe von dict s schaffen, in dem Sie die gleichen Schlüssel in jedem verwendet, aber vorausgesetzt, Sie nur gültigen Python Bezeichner als Schlüssel haben und nicht Veränderlichkeit benötigen,

mynamedtuple.fieldname 

schöner als

mydict['fieldname'] 

und

mynamedtuple = MyNamedTuple(firstvalue, secondvalue) 

ist schöner als

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

Schließlich namedtuple s bestellt, im Gegensatz zu regulären dict s, so dass Sie die Elemente in der Reihenfolge der Felder, im Gegensatz zu einem dict definiert erhalten.

+16

Auch zitiert Raymondh: "Instanzen der benannten Tupel verwenden nicht mehr Platz als normale Tupel. Die Feldnameneigenschaften werden in der NamedTuple-Klasse gespeichert." https: // twitter.com/raymondh/status/524660721968107521 – Moberg

+0

Noch eine Sache zu beachten ist, dass das benannte Tupel auch als 'mynamedtuple = MyNamedTuple (fieldname = erster Wert, zweiter Teilwert = zweiter Wert)' initialisiert werden kann –

26

Tupel sind unveränderlich, ob benannt oder nicht. namedtuple macht nur den Zugriff bequemer, indem Namen statt Indizes verwendet werden. Sie können nur gültige Bezeichner für namedtuple verwenden, es führt kein Hashing durch - es wird stattdessen ein neuer Typ generiert.

Verwandte Themen