2017-02-25 5 views
0

Ich habe ein leeres Wörterbuch, das ich mit der Update-Methode manipuliere. Ich verwende eine Variable als Schlüssel und +1 als Wert. Siehe unten:dict.update() funktioniert nicht wie erwartet

myDict, var = {}, 10 
myDict.update({ var : +1 }) 

Sagen wir, ich dies zweimal ausführen, ich myDict = {10 : 2} erwarten. Stattdessen ist es {10 : 1}.

Ich verstehe, kann ich direkt dieses Problem beheben, indem Sie diese:

myDict[var] += 1 
print (myDict) 
{10 : 2} 

jedoch var ist nicht immer 10 ich erhöhen mag, kann var ein beliebige Zahl sein. Wenn es eine andere Zahl als 10 wäre, würde ich einen KeyError erhalten, da der Schlüssel im Wörterbuch nicht existiert.

Wie kann ich das Wörterbuch mit einer Variablen als Schlüssel aktualisieren und den Wert auf 1 setzen, aber wenn der Schlüssel bereits in myDict existiert, dann wird stattdessen der entsprechende Wert erhöht?

Ich habe dies bereits durch eine Versuch und Ausnahme-Anweisung getan, aber ich fühle es ist nicht sehr Pythonic.

try: 
    myDict[var] += 1 
except: 
    myDict.update({ var : 1 }) 

Auf diese Weise wird es versuchen, durch eine var ‚s-Wert zu erhöhen. Wenn der Schlüssel nicht vorhanden ist, wird stattdessen aktualisiert, um den Schlüssel zu erstellen und den Wert als eins festzulegen. Gibt es einen besseren Weg?

Antwort

3

Sie fragen nach einem Counter; Python bietet dies für Sie im collections Modul:

from collections import Counter 

c = Counter() 
var = 10  
c.update({var: 1}) 
print(c) # Counter({10: 1}) 
c.update({var: 1}) 
print(c) # Counter({10: 2}) 

Sie können das gleiche Ergebnis mit einem einfachen dict erhalten, indem d[var] = d.get(var, 0) + 1 verwenden, wenn Sie aber möchten, die Counter Option ist, meiner Meinung nach, klarer in diesem Fall .

+0

Das funktioniert sehr gut. Ist es möglich, Zähler zu einem Pandas-Datenrahmen hinzuzufügen? Wie ich das gerne am Ende meines Programms machen würde. –

+0

Datenrahmen können ein Wörterbuch als Eingabe nehmen, also wäre ich überrascht, wenn es aus irgendeinem Grund keine Zähler akzeptiert. Wenn nicht, können Sie 'dict (c)' immer benutzen, wenn Sie es übergeben. –

+0

@AugustWilliams Sie müssen nur einen Index übergeben, wenn Ihre Zählimpulse Skalare sind, wie sie scheinen, z. 'pd.DataFrame (Counter ([4, 5, 2, 4, 5]), index = [0])' – miradulo

Verwandte Themen