Ich möchte ein Schlüssel-Wert-Paar in dict einfügen, wenn key nicht in dict.keys () ist. Grundsätzlich könnte ich es tun mit:
if key not in d.keys():
d[key] = value
Aber gibt es einen besseren Weg? Oder was ist die pythonische Lösung für dieses Problem?
python
dictionary
Xiaochen Cui
quelle
quelle
Antworten:
Sie müssen nicht anrufen müssen
d.keys()
, soif key not in d: d[key] = value
reicht. Es gibt keine klarere und besser lesbare Methode.
Sie können erneut mit aktualisieren
dict.get()
, wodurch ein vorhandener Wert zurückgegeben wird, wenn der Schlüssel bereits vorhanden ist:aber ich empfehle dringend dagegen; Dies ist Code-Golf, was die Wartung und Lesbarkeit behindert.
quelle
Verwendung
dict.setdefault()
:>>> d = {1: 'one'} >>> d.setdefault(1, '1') 'one' >>> d # d has not changed because the key already existed {1: 'one'} >>> d.setdefault(2, 'two') 'two' >>> d {1: 'one', 2: 'two'}
quelle
dict.setdefault()
sollte eigentlich nur verwendet werden, wenn versucht wird, auch auf den Wert zuzugreifen.setdefault()
beschreibt klar, was passiert - dass er auch einen Wert zurückgibt, ist nicht so wichtig und ein wenig skurril IMO. Könnten Sie eine kurze Erklärung oder einen Link zu einer geben, warum dies nicht wünschenswert ist?for obj in iterable: d.setdefault(key_for_obj(obj), []).append(obj)
. Der zurückgegebene Wert ist nicht sonderlich eigenartig, das ist der springende Punkt der Methode .if key not in d:
Test.setdefault()
scheint auf das ausgerichtet zu sein, was Sie gesagt haben. Die Verwendung von adefaultdict(list)
würde zu besser lesbarem Code führen als Ihr Beispiel. Vielleicht gibt es keine Verwendung dafür, es sei denn, man muss mit Standardwörterbüchern arbeiten. Insgesamtif key not in d
ist klarer.Seit 3.9 Python können Sie die verwenden Merge Operator
|
zwei Wörterbücher zu fusionieren. Das Diktat rechts hat Vorrang:Hinweis: Dadurch wird ein neues Wörterbuch mit den aktualisierten Werten erstellt.
quelle
Mit dem Folgenden können Sie mehrere Werte einfügen und auch Standardwerte haben, aber Sie erstellen ein neues Wörterbuch.
Ich habe es mit der am häufigsten bewerteten Antwort getestet und im Durchschnitt ist dies schneller, wie im folgenden Beispiel zu sehen ist.
Geschwindigkeitstest zum Vergleich einer for-Schleifen-basierten Methode mit einem Diktatverständnis mit der Entpack-Operator-Methode.
Wenn
d = default_vals.copy()
im ersten Fall keine Kopie ( ) erstellt wird, ist die am häufigsten gewählte Antwort schneller, sobald wir Größenordnungen von10**5
und mehr erreichen. Der Speicherbedarf beider Methoden ist gleich.quelle
{**default_values, **{ key: value }}
Nach den obigen Antworten hat die Methode setdefault () für mich funktioniert.
old_attr_name = mydict.setdefault(key, attr_name) if attr_name != old_attr_name: raise RuntimeError(f"Key '{key}' duplication: " f"'{old_attr_name}' and '{attr_name}'.")
Diese Lösung ist jedoch nicht generisch. Passte einfach zu mir in diesem bestimmten Fall. Die genaue Lösung wäre, nach dem
key
ersten zu suchen (wie bereits empfohlen), abersetdefault()
wir vermeiden eine zusätzliche Suche im Wörterbuch, das ist zwar klein, aber dennoch ein Leistungsgewinn.quelle