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.)

5563voto

Chris B. Punkte 78022

in testet auf die Existenz eines Schlüssels in einer dict :

d = {"key1": 10, "key2": 23}

if "key1" in d:
    print("this will execute")

if "nonexistent key" in d:
    print("this will not")

使用方法 dict.get() um einen Standardwert anzugeben, wenn der Schlüssel nicht vorhanden ist:

d = {}

for i in range(10):
    d[i] = d.get(i, 0) + 1

Um einen Standardwert für jede Taste, entweder mit dict.setdefault() für jeden Auftrag:

d = {}

for i in range(10):
    d[i] = d.setdefault(i, 0) + 1

oder verwenden defaultdict von der collections Modul:

from collections import defaultdict

d = defaultdict(int)

for i in range(10):
    d[i] += 1

103 Stimmen

Normalerweise verwende ich nur get wenn ich den Artikel ohnehin aus dem Wörterbuch herausnehme. Es macht keinen Sinn, mit in den Begriff aus dem Wörterbuch herausziehen.

106 Stimmen

Dem stimme ich voll und ganz zu. Aber wenn Sie nur wissen müssen, ob ein Schlüssel existiert, oder wenn Sie zwischen einem Fall, in dem der Schlüssel definiert ist, und einem Fall, in dem Sie einen Standard verwenden, unterscheiden müssen, in ist die beste Art, dies zu tun.

0 Stimmen

@enkash hat die Referenz für Python 3 bereitgestellt. Hier ist die Referenz für Python 2.7: Diktat y dict.get .

1914voto

Jason Baker Punkte 180981

使用方法 key in my_dict direkt anstelle von key in my_dict.keys() :

if 'key1' in my_dict:
    print("blah")
else:
    print("boo")

Das wird viel sein schneller da es das O(1)-Hashing des Wörterbuchs verwendet, im Gegensatz zu einer linearen O(n)-Suche in einer Liste von Schlüsseln.

2 Stimmen

Funktioniert nicht bei verschachtelten Werten.

298voto

Michael Aaron Safyan Punkte 90663

Sie können auf das Vorhandensein eines Schlüssels in einem Wörterbuch testen, indem Sie die in Stichwort:

d = {'a': 1, 'b': 2}
'a' in d # <== evaluates to True
'c' in d # <== evaluates to False

Eine häufige Anwendung für die Überprüfung des Vorhandenseins eines Schlüssels in einem Wörterbuch vor dessen Änderung ist die Standardinitialisierung des Wertes (z. B. wenn Ihre Werte Listen sind und Sie sicherstellen wollen, dass eine leere Liste vorhanden ist, an die Sie anhängen können, wenn Sie den ersten Wert für einen Schlüssel einfügen). In solchen Fällen finden Sie vielleicht die collections.defaultdict() Typs von Interesse sein.

In älterem Code finden Sie möglicherweise auch einige Verwendungen von has_key() ist eine veraltete Methode zur Überprüfung der Existenz von Schlüsseln in Wörterbüchern (verwenden Sie einfach key_name in dict_name , stattdessen).

186voto

Greg Hewgill Punkte 882617

Sie können Ihren Code auf diese Weise kürzen:

if 'key1' in my_dict:
    ...

Dies ist jedoch allenfalls eine kosmetische Verbesserung. Warum glauben Sie, dass dies nicht der beste Weg ist?

139 Stimmen

Dies ist viel mehr als eine kosmetische Verbesserung. Die Zeit zum Auffinden eines Schlüssels mit dieser Methode ist O(1), während das Aufrufen von Schlüsseln eine Liste erzeugen würde und O(n) wäre.

7 Stimmen

Das O(1) scheint nicht ganz richtig zu sein. Sind Sie sicher, dass es nicht etwas wie O(log n) ist?

17 Stimmen

Es handelt sich um die Komplexität einer einzelnen Diktatsuche, die im Durchschnitt O(1) und im schlimmsten Fall O(n) ist. .list() wird immer O(n) sein. wiki.python.org/moin/Zeitkomplexität

104voto

Wtower Punkte 16895

Für zusätzliche Informationen über die Geschwindigkeit der Ausführung des akzeptierte Antwort ist vorgeschlagenen Methoden (10 Millionen Schleifen):

  • 'key' in mydict Verstrichene Zeit 1,07 Sekunden
  • mydict.get('key') Verstrichene Zeit 1,84 Sekunden
  • mydefaultdict['key'] Verstrichene Zeit 1,07 Sekunden

Daher ist die Verwendung von in o defaultdict werden empfohlen gegen get .

14 Stimmen

Völlig einverstanden, dass get Die 1,84s sind < 1,07*2 ;-P

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