defaultdict
"Le dictionnaire standard inclut la méthode setdefault () pour récupérer une valeur et établir une valeur par défaut si la valeur n'existe pas. En revanche, defaultdict
permet à l'appelant de spécifier la valeur par défaut (valeur à renvoyer) à l'avance lorsque le conteneur est initialisé."
tel que défini par Doug Hellmann dans The Python Standard Library by Example
Comment utiliser defaultdict
Importer defaultdict
>>> from collections import defaultdict
Initialiser defaultdict
Initialisez-le en passant
appelable comme premier argument (obligatoire)
>>> 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 comme deuxième argument (facultatif)
>>> d_int = defaultdict(int, a=10, b=12, c=13)
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12})
ou
>>> kwargs = {'a':10,'b':12,'c':13}
>>> d_int = defaultdict(int, **kwargs)
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12})
Comment ça fonctionne
Comme une classe enfant de dictionnaire standard, elle peut exécuter toutes les mêmes fonctions.
Mais en cas de passage d'une clé inconnue, il renvoie la valeur par défaut au lieu de l'erreur. Par exemple:
>>> d_int['a']
10
>>> d_int['d']
0
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12, 'd': 0})
Si vous souhaitez modifier la valeur par défaut, remplacez 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})
ou
>>> 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})
Exemples dans la question
Exemple 1
Comme int a été passé en tant que default_factory, toute clé inconnue renverra 0 par défaut.
Maintenant que la chaîne est passée dans la boucle, cela augmentera le nombre de ces alphabets en 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})
Exemple 2
Comme une liste a été passée en tant que default_factory, toute clé inconnue (inexistante) renverra [] (ie. List) par défaut.
Maintenant que la liste des tuples est passée dans la boucle, elle ajoutera la valeur dans le d [color]
>>> 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
fois que vous avez terminé de remplir le defaultdict. Voir cette question .