Ich frage mich, was besser zu tun ist:
d = {'a': 1, 'b': 2}
'a' in d
True
oder:
d = {'a': 1, 'b': 2}
d.has_key('a')
True
python
dictionary
igorgue
quelle
quelle
keys()
nur eine satzartige Ansicht in ein Wörterbuch und keine Kopiex in d.keys()
. Trotzdemx in d
ist mehr pythonisch.x in d.keys()
, dass ein temporäres Objekt erstellt und zerstört werden muss, einschließlich der damit verbundenen Speicherzuweisung, bei derx in d.keys()
nur eine arithmetische Operation (Berechnung des Hash) und eine Suche durchgeführt werden. Beachten Sie, dass diesd.keys()
nur etwa zehnmal so lang ist, was eigentlich immer noch nicht lange dauert. Ich habe nicht nachgesehen, bin mir aber ziemlich sicher, dass es nur O (1) ist.in
gewinnt zweifellos, nicht nur in Eleganz (und nicht veraltet zu sein ;-), sondern auch in Leistung, zB:Obwohl die folgende Beobachtung nicht immer zutrifft, werden Sie feststellen, dass in Python die schnellere Lösung normalerweise eleganter und pythonischer ist. Deshalb
-mtimeit
ist es so hilfreich - es geht nicht nur darum, hier und da hundert Nanosekunden zu sparen! -)quelle
has_key
scheint auch O (1) zu sein.Laut Python- Dokumenten :
quelle
has_key()
wird jetzt in Python 3Verwenden
dict.has_key()
Sie diese Option, wenn (und nur wenn) Ihr Code von Python-Versionen vor 2.3 (zum Zeitpunktkey in dict
der Einführung) ausgeführt werden muss.quelle
Es gibt ein Beispiel, bei dem
in
Ihre Leistung tatsächlich beeinträchtigt wird.Wenn Sie
in
einen O (1) -Container verwenden, der nur implementiert__getitem__
undhas_key()
nicht__contains__
, wird eine O (1) -Suche in eine O (N) -Suche umgewandelt (dain
auf eine lineare Suche über zurückgegriffen wird__getitem__
).Fix ist offensichtlich trivial:
quelle
has_key()
ist spezifisch für Python 2-Wörterbücher .in
/__contains__
ist die richtige API; Für Container, in denen ein vollständiger Scan unvermeidbar ist, gibt es ohnehin keinehas_key()
Methode. Wenn es einen O (1) -Ansatz gibt, ist dieser anwendungsfallspezifisch, und der Entwickler muss den richtigen Datentyp für das Problem auswählen.has_key
ist eine Wörterbuch Methode, sondernin
auf jeder Sammlung funktionieren wird, und selbst wenn__contains__
, fehltin
wird eine andere Methode zu Iterierte die Sammlung verwenden , um herauszufinden.quelle
in
Tests anrange
Objekten durchzuführen . Ich bin mir jedoch nicht so sicher, wie effizient Python 2xrange
ist. ;)__contains__
kann trivial berechnen, ob ein Wert im Bereich liegt oder nicht.range
jedes Mal eine neue Instanz zu erstellen . Bei Verwendung einer einzelnen, bereits vorhandenen Instanz ist der Test "Ganzzahl im Bereich" in meinen Timings etwa 40% schneller.Die Lösung für dict.has_key () ist veraltet. Verwenden Sie 'in' - den erhabenen Texteditor 3
Hier habe ich ein Beispiel für ein Wörterbuch mit dem Namen "Alter" genommen -
quelle
Erweiterung der Leistungstests von Alex Martelli mit Adam Parkins Kommentaren ...
quelle
Wenn Sie so etwas haben:
Ändern Sie es für die Ausführung unter Python 3.X und höher wie folgt:
quelle
t.has_key(ew)
Gibt zurück,True
wenn die Wertreferenzenew
auch ein Schlüssel im Wörterbuch sind.key not in t
Gibt zurück,True
wenn der Wert nicht im Wörterbuch enthalten ist. Darüber hinaus ist derkey = ew
Alias sehr, sehr redundant. Die richtige Schreibweise istif ew in t
. Welches ist, was die akzeptierte Antwort von 8 Jahren zuvor Ihnen bereits gesagt hat.