Die Antwort hängt davon ab, wie oft der Schlüssel ist bereits im dict (BTW, hat jemand zu Ihnen erwähnt, wie schlecht eine Idee es ist, eine builtin wie dict
hinter einer Variablen zu verbergen?)
if key not in dct:
dct[key] = foo
Wenn sich der Schlüssel im Wörterbuch befindet, wird ein Wörterbuch gesucht. Wenn sich der Schlüssel im Wörterbuch befindet, wird das Wörterbuch zweimal nachgeschlagen.
try:
dct[key]
except KeyError:
dct[key] = foo
für den Fall Dies können etwas schneller sein, wenn der Schlüssel im Wörterbuch enthalten ist, aber eine Ausnahme hat ziemlich großen Kopfwerfer, so ist es fast immer nicht die beste Option.
dct.setdefault(key, foo)
Dieser ist etwas heikel: Es geht immer zwei Wörterbuch-Lookups: die erste ist die setdefault
Methode in der dict
Klasse zu finden, ist die zweite für key
im dct
Objekt zu suchen. Auch wenn foo
ein Ausdruck ist, wird er jedes Mal ausgewertet, während die früheren Optionen ihn nur dann auswerten, wenn sie es müssen.
Siehe auch collections.defaultdict
. Das ist die beste Lösung für eine große Klasse von Situationen wie dieser.
Es gibt auch die dict.setdefault-Methode: http://docs.python.org/release/2.6.6/library/stdtypes.html#mapping-types-dict – GWW
Die erste tut ** nicht ** eine lineare suchen. Wie Larry Wall es ausdrückte: "Lineare Scans über ein assoziatives Array zu machen ist wie der Versuch, jemanden mit einer geladenen Uzi zu Tode zu schlagen." "dict .__ contains__" entspricht in etwa den ersten 2/3 von 'dict.__getitem__' (ein Hash-Lookup). – delnan
Das ist ein tolles Zitat. – nmichaels