Eine andere Möglichkeit, zu prüfen, ob ein Schlüssel existiert, ist die Verwendung boolescher Operatoren:
d = {'a': 1, 'b':2}
keys = 'abcd'
for k in keys:
x = (k in d and 'blah') or 'boo'
print(x)
Dies ergibt
>>> blah
>>> blah
>>> boo
>>> boo
Erläuterung
Zunächst sollten Sie wissen, dass in Python, 0
, None
oder Objekte mit der Länge Null werden zu False
. Alles andere wird bewertet als True
. Boolesche Operationen werden von links nach rechts ausgewertet und geben den Operanden nicht True oder False zurück.
Sehen wir uns ein Beispiel an:
>>> 'Some string' or 1/0
'Some string'
>>>
から 'Some string'
wertet aus zu True
, der Rest der or
wird nicht ausgewertet und es wird kein Fehler bei der Division durch Null ausgelöst.
Aber wenn wir die Reihenfolge ändern 1/0
wird zuerst ausgewertet und löst eine Ausnahme aus:
>>> 1/0 or 'Some string'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>>
Wir können dieses Muster verwenden, um zu prüfen, ob ein Schlüssel existiert.
(k in d and 'blah')
tut dasselbe wie
if k in d:
'blah'
else:
False
Dies liefert bereits das korrekte Ergebnis, wenn der Schlüssel existiert, aber wir wollen, dass er "boo" ausgibt, wenn er nicht existiert. Wir nehmen also das Ergebnis und or
es mit 'boo'
>>> False or 'boo'
'boo'
>>> 'blah' or 'boo'
'blah'
>>>
31 Stimmen
Aufruf von
dict.keys()
erstellt eine Liste von Schlüsseln, entsprechend der Dokumentation docs.python.org/2/library/stdtypes.html#dict.keys aber es würde mich überraschen, wenn dieses Muster in einer seriösen Implementierung nicht so optimiert wäre, dass es sich inif 'key1' in dict:
.7 Stimmen
So habe ich endlich herausgefunden, warum viele meiner Python-Skripte so langsam waren :) :(. Das liegt daran, dass ich seit Jahren
x in dict.keys()
um nach Schlüsseln zu suchen. Und das geschah, weil die übliche Art, in Java über Schlüssel zu iterieren, istfor (Type k : dict.keySet())
diese Gewohnheit verursachtfor k in dict.keys()
sich natürlicher anfühlen alsfor k in dict
(was in Bezug auf die Leistung immer noch in Ordnung sein sollte?), aber dann wird die Überprüfung der Schlüssel zuif k in dict.keys()
auch, was ein Problem ist...4 Stimmen
@EvgeniSergeev
if k in dict_:
prüft auf das Vorhandensein von k in den KEYS von dict_, so dass Sie immer noch nicht brauchendict_.keys()
. (Das hat mich gestört, denn es liest sich für mich wie ein Test für ein Wert in dict. Ist es aber nicht.)1 Stimmen
@ToolmakerSteve Das stimmt, aber das ist nicht nur unnötig, sondern auch keine gute Praxis.
26 Stimmen
Versuchen Sie "Diktat eintippen".