2675 Stimmen

Prüfen, ob ein bestimmter Schlüssel bereits in einem Wörterbuch existiert

Ich wollte testen, ob ein Schlüssel in einem Wörterbuch vorhanden ist, bevor ich den Wert für den Schlüssel aktualisiere. Ich habe den folgenden Code geschrieben:

if 'key1' in dict.keys():
  print "blah"
else:
  print "boo"

Ich denke, dass dies nicht der beste Weg ist, um diese Aufgabe zu bewältigen. Gibt es eine bessere Möglichkeit, nach einem Schlüssel im Wörterbuch zu suchen?

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 in if '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, ist for (Type k : dict.keySet()) diese Gewohnheit verursacht for k in dict.keys() sich natürlicher anfühlen als for k in dict (was in Bezug auf die Leistung immer noch in Ordnung sein sollte?), aber dann wird die Überprüfung der Schlüssel zu if 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 brauchen dict_.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.)

25voto

Bishwas Mishra Punkte 1094

Sie können die Ergebnisse auf folgende Weise erhalten:

Was besser ist, hängt von 3 Dingen ab:

  1. Verfügt das Wörterbuch "normalerweise über den Schlüssel" oder "normalerweise nicht über den Schlüssel".
  2. Beabsichtigen Sie, Bedingungen wie if...else...elseif...else zu verwenden?
  3. Wie groß ist das Wörterbuch?

Lesen Sie mehr: http://paltman.com/try-except-performance-in-python-a-simple-test/

Verwendung von try/block anstelle von 'in' oder 'if':

try:
    my_dict_of_items[key_i_want_to_check]
except KeyError:
    # Do the operation you wanted to do for "key not present in dict".
else:
    # Do the operation you wanted to do with "key present in dict."

21voto

wan kenobi Punkte 283

Nur Python 2: (und Python 2.7 unterstützt bereits `in`)

Sie können die has_key() método:

if dict.has_key('xyz')==1:
    # Update the value for the key
else:
    pass

33 Stimmen

.has_key() wurde Abgelehnt ; Sie sollten verwenden in wie in anderen Antworten gezeigt.

13 Stimmen

Übrigens empfehle ich die Lektüre ALLE vorhandene Antworten auf eine OLD Frage, bevor Sie sie beantworten. Diese Antwort fügte nichts hinzu, da der Vorschlag bereits in Michaels Antwort aus dem Jahr 2009 enthalten war. (Ich möchte Sie nicht entmutigen, wenn Sie versuchen, etwas Nützliches zu einer Diskussion beizutragen. Versuchen Sie es weiter.)

20voto

Mauricio Morales Punkte 995

Nur zu Ihrer Information und zur Ergänzung Chris. Die (beste) Antwort von B :

d = defaultdict(int)

Funktioniert ebenfalls; der Grund dafür ist, dass der Aufruf von int() gibt zurück. 0 Das ist es, was defaultdict hinter den Kulissen (beim Aufbau eines Wörterbuchs) ausführt, daher die Bezeichnung "Factory Function" in der Dokumentation.

3 Stimmen

Wenn Sie ein Wörterbuch mit Zählungen erstellen, sollten Sie Zähler (Python 2.7 vorausgesetzt). Und ich habe defaultdict(lambda: 0) 代わりに defaultdict(int) weil ich denke, dass es klarer ist, was vor sich geht; der Leser muss nicht wissen, dass man sich 0 wenn Sie anrufen int() ohne Argumente. YMMV.

10voto

Siva Gnanam Punkte 878

Ein Python-Wörterbuch hat eine Methode namens __contains__ . Diese Methode gibt True zurück, wenn das Wörterbuch den Schlüssel enthält, andernfalls False.

>>> temp = {}

>>> help(temp.__contains__)

Help on built-in function __contains__:

__contains__(key, /) method of builtins.dict instance
    True if D has a key k, else False.

6 Stimmen

Es ist eine sehr schlechte Praxis, die __contains__ direkt. Die korrekte Vorgehensweise ist die Verwendung von in Operator, der die containment check die die __contains__ Funktion.

0 Stimmen

@user1767754 Ich benutze foo = x['foo'] if x.__contains__('foo') else 'bar' . Irgendwelche Ideen, wie man die in Operator als Teil dieses Ausdrucks?

3 Stimmen

foo = x['foo'] if 'foo' in x else 'bar'

7voto

J. Antunes Punkte 159

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'
>>>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X