defaultdict
"Il dizionario standard include il metodo setdefault () per recuperare un valore e stabilire un valore predefinito se il valore non esiste. Al contrario, defaultdict
consente al chiamante di specificare il valore predefinito (valore da restituire) in anticipo quando il contenitore viene inizializzato."
come definito da Doug Hellmann in The Python Standard Library con l'esempio
Come usare defaultdict
Importa defaultdict
>>> from collections import defaultdict
Inizializza defaultdict
Inizializzalo passando
richiamabile come primo argomento (obbligatorio)
>>> d_int = defaultdict(int)
>>> d_list = defaultdict(list)
>>> def foo():
... return 'default value'
...
>>> d_foo = defaultdict(foo)
>>> d_int
defaultdict(<type 'int'>, {})
>>> d_list
defaultdict(<type 'list'>, {})
>>> d_foo
defaultdict(<function foo at 0x7f34a0a69578>, {})
** kwargs come secondo argomento (facoltativo)
>>> d_int = defaultdict(int, a=10, b=12, c=13)
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12})
o
>>> kwargs = {'a':10,'b':12,'c':13}
>>> d_int = defaultdict(int, **kwargs)
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12})
Come funziona
Come è una classe figlio del dizionario standard, può svolgere tutte le stesse funzioni.
Ma in caso di passaggio di una chiave sconosciuta restituisce il valore predefinito invece di errore. Ad esempio:
>>> d_int['a']
10
>>> d_int['d']
0
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12, 'd': 0})
Nel caso in cui si desideri modificare il valore predefinito, sovrascrivere default_factory:
>>> d_int.default_factory = lambda: 1
>>> d_int['e']
1
>>> d_int
defaultdict(<function <lambda> at 0x7f34a0a91578>, {'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0})
o
>>> def foo():
... return 2
>>> d_int.default_factory = foo
>>> d_int['f']
2
>>> d_int
defaultdict(<function foo at 0x7f34a0a0a140>, {'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0, 'f': 2})
Esempi nella domanda
Esempio 1
Poiché int è stato passato come default_factory, qualsiasi chiave sconosciuta restituirà 0 per impostazione predefinita.
Ora che la stringa viene passata nel ciclo, aumenterà il conteggio di quegli alfabeti in d.
>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> d.default_factory
<type 'int'>
>>> for k in s:
... d[k] += 1
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]
>>> d
defaultdict(<type 'int'>, {'i': 4, 'p': 2, 's': 4, 'm': 1})
Esempio 2
Poiché un elenco è stato passato come default_factory, qualsiasi chiave sconosciuta (inesistente) restituirà [] (cioè elenco) per impostazione predefinita.
Ora che l'elenco delle tuple viene passato nel ciclo, aggiungerà il valore in d [colore]
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> d.default_factory
<type 'list'>
>>> for k, v in s:
... d[k].append(v)
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
>>> d
defaultdict(<type 'list'>, {'blue': [2, 4], 'red': [1], 'yellow': [1, 3]})
default_factory = None
volta terminato il popolamento del valore predefinito. Vedere questa domanda .