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
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
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"
Richtig, aber es wurde bereits beantwortet, herzlich willkommen bei Stackoveflow, danke für das Beispiel, überprüfe jedoch immer die Antworten!
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
Wunderbare Statistiken, manchmal implizit ist möglicherweise besser als explizit (zumindest in Bezug auf Effizienz)...
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.
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).
@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
. ;)
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.
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.