2016-07-20 6 views
5

Wenn mit Python 3 Wörterbücher arbeiten, ich muss immer wieder etwas zu tun:Wie nativ erhöht man den Wert eines Wörterbuchelements?

d=dict() 
if 'k' in d: 
    d['k']+=1 
else: 
    d['k']=0 

ich dort zu erinnern scheinen eine native Weg, um dies zu tun, wurde aber durch die Dokumentation suchen und nicht finden konnten, . Weißt du was das ist?

Antwort

12

Dies ist der Anwendungsfall für collections.defaultdict, in dem einfach die int aufgerufen wird, die für die Standardfabrik abrufbar ist.

>>> from collections import defaultdict 
>>> d = defaultdict(int) 
>>> d 
defaultdict(<class 'int'>, {}) 
>>> d['k'] +=1 
>>> d 
defaultdict(<class 'int'>, {'k': 1}) 

A defaultdict konfiguriert ist, Elemente zu erstellen, wenn ein fehlender Schlüssel gesucht wird. Sie stellen es mit einem Callable (hier int()) zur Verfügung, das es verwendet, um einen Standardwert zu erzeugen, wann immer der Lookup mit __getitem__ einen Schlüssel übergeben wird, der nicht vorhanden ist. Diese aufrufbare Nachricht wird in einem Instanzattribut mit der Bezeichnung default_factory gespeichert.

Wenn Sie keine default_factory bereitstellen, erhalten Sie eine KeyError wie für fehlende Schlüssel üblich.

Dann nehmen an, Sie einen anderen Standardwert, vielleicht 1 statt 0 wollten müssen Sie würden einfach eine aufrufbare übergeben, die den gewünschten Startwert, in diesem Fall liefert sehr triviale

>>> d = defaultdict(lambda: 1) 

Dies könnte natürlich auch sei eine regulär benannte Funktion.


Es ist erwähnenswert, jedoch, dass, wenn in Ihrem Fall Sie versuchen, nur ein Wörterbuch verwenden, um die Anzahl der bestimmten Werte zu speichern, ein collections.Counter besser geeignet für den Job ist.

>>> from collections import Counter 
>>> Counter('kangaroo') 
Counter({'a': 2, 'o': 2, 'n': 1, 'r': 1, 'k': 1, 'g': 1}) 
0

Beachten Sie, dass Sie immer die Unordnung aus dem if stamemt indem sie ihn in einem Ausdruck entfernen:

d['k'] = d['k'] + 1 if 'k' in d else 0 
Verwandte Themen