Wie kann ich bei einem gegebenen Wörterbuch herausfinden, ob ein bestimmter Schlüssel in diesem Wörterbuch bereits auf einen Wert ungleich "Keine" gesetzt wurde?
Dh ich möchte das tun:
my_dict = {}
if (my_dict[key] != None):
my_dict[key] = 1
else:
my_dict[key] += 1
Das heißt, ich möchte den Wert erhöhen, wenn bereits einer vorhanden ist, oder ihn ansonsten auf 1 setzen.
python
dictionary
Ben
quelle
quelle
Antworten:
Sie suchen
collections.defaultdict
(verfügbar für Python 2.5+). Dieswird tun was du willst.
Für die regelmäßigen Python
dict
s, wenn es keinen Wert für einen bestimmten Schlüssel ist, werden Sie nicht erhalten ,None
wenn die dict Zugriff - eineKeyError
wird erhöht werden. Wenn Sie also einen regulärendict
Code anstelle Ihres Codes verwenden möchten, würden Sie diesen verwendenquelle
dict
s können Sie tunmy_dict[key] = my_dict.get(key, 0) + 1
.Ich bevorzuge dies in einer Codezeile.
Wörterbücher haben eine Funktion, get, die zwei Parameter akzeptiert - den gewünschten Schlüssel und einen Standardwert, falls dieser nicht vorhanden ist. Ich bevorzuge diese Methode gegenüber defaultdict, da Sie nur den Fall behandeln möchten, in dem der Schlüssel nicht in dieser einen Codezeile vorhanden ist, nicht überall.
quelle
Ich persönlich benutze gerne
setdefault()
quelle
setdefault
ist großartig. Der Wert wird nicht geändert, wenn bereits einer festgelegt istsome_key
. Zum Beispield={1:2}; d.setdefault(1, 0)
stört der Wert von nichtd[1]
.Dafür brauchen Sie die
key in dict
Redewendung.Sie sollten jedoch wahrscheinlich die Verwendung in Betracht ziehen
defaultdict
(wie von dF vorgeschlagen).quelle
my_dict[key] is not None
, was klarer ist (zumindest IMHO)if key in my_dict and my_dict[key]:
Um die Frage zu beantworten, " wie kann ich herausfinden, ob ein bestimmter Index in diesem Diktat bereits auf einen Nicht-Keine-Wert gesetzt wurde ", würde ich Folgendes bevorzugen:
Dies entspricht dem bereits angeführten Konzept der EAFP (leichter um Vergebung zu bitten als um Erlaubnis). Außerdem wird die Suche nach doppelten Schlüsseln im Wörterbuch vermieden, wie dies bei
key in my_dict and my_dict[key] is not None
interessanten Suchvorgängen der Fall wäre.Für das eigentliche Problem , das Sie gestellt haben, dh das Erhöhen eines int, falls vorhanden, oder das Setzen auf einen anderen Standardwert, empfehle ich auch das
wie in der Antwort von Andrew Wilkinson.
Es gibt eine dritte Lösung, wenn Sie modifizierbare Objekte in Ihrem Wörterbuch speichern. Ein häufiges Beispiel hierfür ist eine Multimap , in der Sie eine Liste von Elementen für Ihre Schlüssel speichern. In diesem Fall können Sie Folgendes verwenden:
Wenn im Wörterbuch kein Wert für key vorhanden ist, setzt ihn die setdefault-Methode auf den zweiten Parameter von setdefault. Es verhält sich wie ein Standard-my_dict [Schlüssel] und gibt den Wert für den Schlüssel zurück (der möglicherweise der neu eingestellte Wert ist).
quelle
Einverstanden mit cgoldberg. Wie ich es mache ist:
Machen Sie es entweder wie oben beschrieben oder verwenden Sie ein Standarddiktat, wie andere vorgeschlagen haben. Verwenden Sie keine if-Anweisungen. Das ist nicht Pythonic.
quelle
+=2
oder-=1
? Sie müssen daran denken, beide Zeilen zu ändern. Es mag jetzt wie eine triviale Sache erscheinen, aber das sind die Art von dummen kleinen 'trivialen' Fehlern, die zurückkommen können, um dich zu beißen.Wie Sie den vielen Antworten entnehmen können, gibt es mehrere Lösungen. Eine Instanz von LBYL (schauen, bevor Sie springen) wurde noch nicht erwähnt, die Methode has_key ():
quelle
Die Art und Weise, wie Sie dies versuchen, heißt LBYL (schauen Sie, bevor Sie springen), da Sie die Bedingungen überprüfen, bevor Sie versuchen, Ihren Wert zu erhöhen.
Der andere Ansatz heißt EAFP (leichter um Vergebung zu bitten als um Erlaubnis). In diesem Fall würden Sie einfach die Operation versuchen (den Wert erhöhen). Wenn dies fehlschlägt, fangen Sie die Ausnahme ab und setzen den Wert auf 1. Dies ist eine etwas pythonischere Methode (IMO).
http://mail.python.org/pipermail/python-list/2003-May/205182.html
quelle
Ein bisschen spät, aber das sollte funktionieren.
quelle
Dies beantwortet die Frage nicht direkt, aber für mich sieht es so aus, als ob Sie die Funktionalität von Sammlungen möchten .
Dies führt zur Ausgabe
quelle
defaultdict(int)
einige zusätzliche Funktionen, sodass er perfekt funktioniert, wenn ausschließlich mit Ganzzahlen gearbeitet wird, Sie jedoch keines der relevanten Verhaltensweisen anzeigen.Hier ist ein Einzeiler, den ich kürzlich zur Lösung dieses Problems entwickelt habe. Es basiert auf der setdefault- Wörterbuchmethode:
quelle
Ich habe danach gesucht, es nicht im Web gefunden, dann mein Glück mit Try / Error versucht und es gefunden
quelle
__contains__
in einem Produktionscode verwenden. Übrigens.__contains__
ist das gleiche wie mitis
.my_dict.__contains__(some_key)
ist gleichbedeutend mitsome_key in my_dict
, ist Überlastung fürin
Betreiber nichtis