2016-07-20 21 views

Odpowiedz

12

Jest to przypadek użycia dla collections.defaultdict, tutaj po prostu za pomocą numeru int na żądanie dla fabryki fabrycznej.

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

defaultdict skonfigurowany jest do tworzenia elementów kiedy brakujący klucz jest poszukiwany. Dostarczysz mu możliwość wywołania (tutaj int()), której używa do tworzenia wartości domyślnej, gdy wyszukiwanie z __getitem__ jest przekazywane kluczem, który nie istnieje. To wywołanie jest przechowywane w atrybucie instancji o nazwie default_factory.

Jeśli nie podasz numeru default_factory, otrzymasz numer KeyError jak zwykle za brakujące klucze.

Następnie załóżmy, że chciał inną wartość domyślną, chyba 1 zamiast 0. Można by po prostu muszą przejść wywoływalnym który zapewnia żądaną wartość początkowa, w tym przypadku bardzo trywialnie

>>> d = defaultdict(lambda: 1) 

to może oczywiście również być dowolną zwykłą, nazwaną funkcją.


Warto zauważyć jednak, że jeśli w przypadku, gdy starają się po prostu korzystać ze słownika, aby zapisać liczbę poszczególnych wartości, collections.Counter jest bardziej odpowiedni do tego zadania.

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

Należy pamiętać, że zawsze można usunąć bałaganu z if stamemt używając go w wyrażeniu:

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