2012-10-20 13 views
15

W Pythonie jest to irytujące, aby sprawdzić, czy klucz jest w słowniku zanim zwiększając go:Python słownika przyrost

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

Czy istnieje krócej substytutem czterech liniach powyżej?

+0

czy możesz zrobić to samo dla dwóch wartości? – Mohsin

Odpowiedz

33

Alternatywą jest:

my_dict[key] = my_dict.get(key, 0) + num 
+0

możesz zrobić to dla wielu wartości? mam na myśli wzrost o więcej niż jedną wartość – Mohsin

+1

Bez pętli? Ponieważ 'dict' nie zapewnia sposobu na dostęp do wielu elementów w pojedynczym wyrażeniu, nie widzę sposobu. –

+0

Z pętlą, tak jak OP pisze w swoim pytaniu, ale zwiększając dwie wartości na klucz, nie jeden – Mohsin

14

Masz sporo możliwości. I jak za pomocą Counter:

>>> from collections import Counter 
>>> d = Counter() 
>>> d[12] += 3 
>>> d 
Counter({12: 3}) 

Or defaultdict:

>>> from collections import defaultdict 
>>> d = defaultdict(int) # int() == 0, so the default value for each key is 0 
>>> d[12] += 3 
>>> d 
defaultdict(<function <lambda> at 0x7ff2fe7d37d0>, {12: 3}) 
+1

Dla 'lambda: 0', możesz po prostu powiedzieć,' int'. – hughdbrown

+1

@hughdbrown: Dzięki, nigdy o tym nie wiedziałem. – Blender

+0

@hughdbrown bez twojego komentarza Nigdy bym nie zrozumiał, co robił defaultdict. Dziękuję Ci. –

4

transform:

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

w następujących użyciu setdefault:

my_dict[key] = my_dict.setdefault(key, 0) + num 
Powiązane problemy