1124 Stimmen

Soll ich 'has_key()' oder 'in' auf Python-Dicts verwenden?

Gegeben:

>>> d = {'a': 1, 'b': 2}

Welches der folgenden ist der beste Weg zu überprüfen, ob 'a' in d enthalten ist?

>>> 'a' in d
True

>>> d.has_key('a')
True

26voto

Greena modi Punkte 383

Lösung für dict.has_key() ist veraltet, verwenden Sie 'in' - Sublime Text Editor 3

Hier habe ich ein Beispiel für ein Dictionary mit dem Namen 'ages' genommen -

ages = {}

# Füge ein paar Namen zum Dictionary hinzu
ages['Sue'] = 23

ages['Peter'] = 19

ages['Andrew'] = 78

ages['Karren'] = 45

# Verwendung von 'in' in der if-Bedingung anstelle von function_name.has_key(key-name).
if 'Sue' in ages:

    print "Sue ist im Dictionary. Sie ist", ages['Sue'], "Jahre alt"

else:

    print "Sue ist nicht im Dictionary"

7 Stimmen

Richtig, aber es wurde bereits beantwortet, herzlich willkommen bei Stackoveflow, danke für das Beispiel, überprüfe jedoch immer die Antworten!

1 Stimmen

@igorgue Ich bin mir nicht sicher über die Downvotes für sie. Ihre Antwort mag ähnlich sein wie die bereits gegebenen, aber sie liefert ein Beispiel. Ist das nicht wertvoll genug, um eine Antwort auf SO zu sein?

21voto

Bruno Bronosky Punkte 60135

Erweiterung der Leistungstests von Alex Martelli mit den Kommentaren von Adam Parkin...

$ python3.5 -mtimeit -s'd=dict.fromkeys(range( 99))' 'd.has_key(12)'
Traceback (most recent call last):
  File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/timeit.py", line 301, in main
    x = t.timeit(number)
  File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/timeit.py", line 178, in timeit
    timing = self.inner(it, self.timer)
  File "", line 6, in inner
    d.has_key(12)
AttributeError: 'dict' object has no attribute 'has_key'

$ python2.7 -mtimeit -s'd=dict.fromkeys(range(  99))' 'd.has_key(12)'
10000000 Schleifen, best of 3: 0.0872 usec pro Schleife

$ python2.7 -mtimeit -s'd=dict.fromkeys(range(1999))' 'd.has_key(12)'
10000000 Schleifen, best of 3: 0.0858 usec pro Schleife

$ python3.5 -mtimeit -s'd=dict.fromkeys(range(  99))' '12 in d'
10000000 Schleifen, best of 3: 0.031 usec pro Schleife

$ python3.5 -mtimeit -s'd=dict.fromkeys(range(1999))' '12 in d'
10000000 Schleifen, best of 3: 0.033 usec pro Schleife

$ python3.5 -mtimeit -s'd=dict.fromkeys(range(  99))' '12 in d.keys()'
10000000 Schleifen, best of 3: 0.115 usec pro Schleife

$ python3.5 -mtimeit -s'd=dict.fromkeys(range(1999))' '12 in d.keys()'
10000000 Schleifen, best of 3: 0.117 usec pro Schleife

0 Stimmen

Wunderbare Statistiken, manchmal implizit ist möglicherweise besser als explizit (zumindest in Bezug auf Effizienz)...

0 Stimmen

Danke, @varun. Ich hatte diese Antwort vergessen. Ich muss solche Tests öfter durchführen. Ich lese regelmäßig lange Threads, in denen Leute darüber diskutieren, Die beste Methode™ Dinge zu erledigen. Aber ich erinnere mich selten daran, wie einfach es war, Beweise zu erhalten.

0 Stimmen

Dieses Experiment hat einen Fehler, es hat die Erstellung des Dictionarys mit der Suche nach dem Schlüssel gemischt. Es ist besser, die beiden zu trennen, um die Zeit für die Schlüsselsuche zu messen. Sobald Sie die beiden trennen, würde das Timing-Ergebnis zeigen, dass sowohl 'key in D' als auch 'key in D.keys()' anscheinend O(1) sind. Kein wesentlicher Unterschied, obwohl 'key in D.keys()' etwas langsamer ist als 'key in D', ist es nicht O(N) vs. O(1).

15voto

u0b34a0f6ae Punkte 45029

has_key ist eine Methode des Wörterbuchs, aber in funktioniert bei jeder Sammlung, auch wenn __contains__ fehlt. in verwendet jede andere Methode, um die Sammlung zu durchlaufen und herauszufinden.

1 Stimmen

Und funktioniert auch bei Iteratoren "x in xrange(90, 200) <=> 90 <= x < 200"

1 Stimmen

...: Das scheint eine sehr schlechte Idee zu sein: 50 Operationen statt 2.

1 Stimmen

@Clément In Python 3 ist es tatsächlich ziemlich effizient, in-Tests auf range-Objekten durchzuführen. Ich bin mir jedoch nicht so sicher über seine Effizienz in Python 2 mit xrange. ;)

-6voto

Harshita Jhavar Punkte 149

Wenn Sie so etwas haben:

t.has_key(ew)

ändern Sie es wie folgt, damit es in Python 3.X und höher ausgeführt werden kann:

key = ew
if key not in t

11 Stimmen

Nein, du hast den Test umgekehrt. t.has_key(ew) gibt True zurück, wenn der Wert, auf den ew verweist, auch ein Schlüssel im Wörterbuch ist. key not in t gibt True zurück, wenn der Wert nicht im Wörterbuch ist. Außerdem ist das Alias key = ew sehr, sehr überflüssig. Die korrekte Schreibung lautet if ew in t. Das ist es, was dir die akzeptierte Antwort von vor 8 Jahren bereits gesagt hat.

1 Stimmen

Die Antwort wurde geändert. =) Nur um Missverständnisse zu vermeiden.

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