Überprüfen Sie, ob ein bestimmter Schlüssel bereits in einem Wörterbuch vorhanden ist, und es erhöht

StackOverflow https://stackoverflow.com/questions/473099

  •  19-08-2019
  •  | 
  •  

Frage

ein Wörterbuch Gegeben, wie kann ich, wenn eine bestimmte Taste in diesem Wörterbuch bereits auf einen Nicht-None-Wert eingestellt wurde herausgefunden?

.

D.h., ich möchte, dies zu tun:

my_dict = {}

if (my_dict[key] != None):
  my_dict[key] = 1
else:
  my_dict[key] += 1

d., Möchte ich den Wert erhöhen, wenn es eine ist schon da, oder es auf 1 anders gesetzt.

War es hilfreich?

Lösung

Sie suchen collections.defaultdict (verfügbar für Python 2.5 +). Diese

from collections import defaultdict

my_dict = defaultdict(int)
my_dict[key] += 1

wird tun, was Sie wollen.

Für die regelmäßigen Python dicts, wenn kein Wert für einen bestimmten Schlüssel ist, werden Sie nicht None erhalten, wenn die dict Zugriff - ein KeyError werden erhöht werden. Wenn Sie also eine regelmäßige dict verwenden möchten, statt Code würden Sie verwenden

if key in my_dict:
    my_dict[key] += 1
else:
    my_dict[key] = 1

Andere Tipps

Ich ziehe diesen Code in einer Zeile zu tun.

my_dict = {}

my_dict[some_key] = my_dict.get(some_key, 0) + 1

Wörterbücher haben eine Funktion erhalten, die zwei Parameter übernimmt - den Schlüssel, den Sie möchten, und einen Standardwert, wenn es nicht existiert. Ich ziehe diese Methode defaultdict, da Sie nur den Fall behandeln wollen, wo der Schlüssel nicht in dieser einer Zeile Code existiert, nicht überall.

Ich persönlich mag mit setdefault()

my_dict = {}

my_dict.setdefault(some_key, 0)
my_dict[some_key] += 1

Sie müssen das key in dict Idiom für die.

if key in my_dict and not (my_dict[key] is None):
  # do something
else:
  # do something else

Sie sollten jedoch wahrscheinlich betrachten defaultdict verwenden (wie dF vorgeschlagen).

Um die Frage zu beantworten „ wie kann ich in diesem dict, wenn ein bestimmte Index bereits auf einen Nicht-None-Wert eingestellt wurde herausfinden “, ich würde die lieber:

try:
  nonNone = my_dict[key] is not None
except KeyError:
  nonNone = False

Dies entspricht das bereits aufgerufen Konzept der EAFP (leichte Vergebung bitten dann die Erlaubnis). Es vermeidet auch die doppelte Schlüsselsuche im Wörterbuch wie es wäre, in key in my_dict and my_dict[key] is not None, was interessant ist, wenn Lookup teuer ist.

Für das eigentliche Problem , die Sie gestellt haben, das heißt eine int Inkrementieren wenn es vorhanden ist, oder es auf einen Standardwert Einstellung ansonsten empfehle ich auch die

my_dict[key] = my_dict.get(key, default) + 1

, wie in der Antwort von Andrew Wilkinson.

Es gibt eine dritte Lösung, wenn Sie modifizierbare Objekte in Ihrem Wörterbuch sind zu speichern. Ein typisches Beispiel dafür ist ein multimap , wo Sie für Ihre Schlüssel eine Liste von Elementen speichern. In diesem Fall können Sie:

my_dict.setdefault(key, []).append(item)

Wenn ein Wert für Schlüssel nicht im Wörterbuch vorhanden ist, die setdefault Verfahren wird es auf den zweiten Parameter von setdefault eingestellt. Es verhält sich wie ein Standard my_dict [key], um den Wert für den Schlüssel zurückkehrt (die den neu eingestellten Wert sein kann).

Vereinbarte mit cgoldberg. Wie ich es ist:

try:
    dict[key] += 1
except KeyError:
    dict[key] = 1

Also entweder tut es, wie oben, oder einen Standard-dict verwenden, wie andere vorgeschlagen haben. Nicht, wenn Anweisungen verwenden. Das ist nicht Pythonic.

Wie Sie aus den vielen Antworten sehen können, gibt es mehrere Lösungen. Eine Instanz von LBYL (sehen Sie vor dem Sprung) wurde noch nicht erwähnt, die has_key () Methode:

my_dict = {}

def add (key):
    if my_dict.has_key(key):
        my_dict[key] += 1
    else:
        my_dict[key] = 1

if __name__ == '__main__':
    add("foo")
    add("bar")
    add("foo")
    print my_dict

Die Art und Weise Sie versuchen, es zu tun genannt wird LBYL (schauen Sie vor dem Sprung), da Sie Bedingungen überprüft, bevor Sie Ihren Wert zu erhöhen.

Der andere Ansatz ist EAFP genannt (leichte Vergebung bittet dann die Erlaubnis). In diesem Fall würden Sie versuchen, nur die Operation (den Wert erhöhen). Wenn es fehlschlägt, fangen Sie die Ausnahme und setzen Sie den Wert auf 1. Dies ist ein etwas Pythonic Weg, es zu tun (IMO).

http://mail.python.org/pipermail /python-list/2003-May/205182.html

Ein bisschen spät, aber dies sollte funktionieren.

my_dict = {}
my_dict[key] = my_dict[key] + 1 if key in my_dict else 1

Dieser antwortet nicht direkt auf die Frage, aber für mich sieht es aus wie Sie die Funktionalität eines href wollen vielleicht <= "https://docs.python.org/3/library/collections.html#collections. Counter“rel = "noreferrer"> collections.Counter .

from collections import Counter

to_count = ["foo", "foo", "bar", "baz", "foo", "bar"]

count = Counter(to_count)

print(count)

print("acts just like the desired dictionary:")
print("bar occurs {} times".format(count["bar"]))

print("any item that does not occur in the list is set to 0:")
print("dog occurs {} times".format(count["dog"]))

print("can iterate over items from most frequent to least:")
for item, times in count.most_common():
    print("{} occurs {} times".format(item, times))

Dies resultiert in der Ausgabe

Counter({'foo': 3, 'bar': 2, 'baz': 1})
acts just like the desired dictionary:
bar occurs 2 times
any item that does not occur in the list is set to 0:
dog occurs 0 times
can iterate over items from most frequent to least:
foo occurs 3 times
bar occurs 2 times
baz occurs 1 times

Hier Einzeiler, die ich mit vor kurzem kam zur Lösung dieses Problems. Es basiert auf der setdefault Wörterbuch-Methode:

my_dict = {}
my_dict[key] = my_dict.setdefault(key, 0) + 1

Ich war für sie suchen, nicht auf Web gefunden habe dann versucht, mein Glück mit Try / Fehler und fand es

my_dict = {}

if my_dict.__contains__(some_key):
  my_dict[some_key] += 1
else:
  my_dict[some_key] = 1
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top