824 votes

Comment collections.defaultdict fonctionne

J'ai lu les exemples dans python docs, mais je n'arrive toujours pas à comprendre ce que signifie cette méthode. Quelqu'un peut-il aider? Voici deux exemples tirés des documents python

 >>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
...     d[k] += 1
...
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]
 

et

 >>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
...
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
 

les paramètres "int" et "list" sont pour quoi?

883voto

Sven Marnach Points 133943

Généralement, un dictionnaire Python jette un KeyError si vous essayez d'obtenir un produit avec une clé qui n'est pas actuellement dans le dictionnaire. L' defaultdict en revanche il suffit de créer tous les éléments que vous tentez d'accéder (à condition bien sûr qu'ils n'existent pas encore). Pour créer un tel "défaut", il appelle la fonction de l'objet que vous passer dans le constructeur (ou plus précisément, c'est l'arbitraire d'un "callable" objet, qui inclut la fonction et le type d'objets). Pour le premier exemple, par défaut, les éléments sont créés à l'aide de int(), qui sera de retour l'objet integer 0. Pour le deuxième exemple, défaut des éléments sont créés à l'aide de list(), qui renvoie une nouvelle liste vide de l'objet.

311voto

nightcracker Points 34498

defaultdict signifie que si une clé n'est pas trouvée dans le dictionnaire, au lieu d'un KeyError une nouvelle valeur est créée. Le type de cette nouvelle paire est donné par l'argument de defaultdict.

Par exemple:

 somedict = {}
print(somedict[3]) # KeyError

someddict = defaultdict(int)
print(someddict[3]) # print int(), thus 0
 

20voto

varagrawal Points 530

Il ya une grande explication de defaultdicts ici: http://ludovf.net/blog/python-collections-defaultdict/

Fondamentalement, les paramètres de type int et de la liste sont des fonctions que vous passez. Rappelez-vous que Python accepte les noms de fonction en tant qu'arguments. int renvoie la valeur 0 par défaut et liste renvoie une liste vide lorsqu'il est appelé avec des parenthèses.

En normal, les dictionnaires, si dans votre exemple, j'ai essayer d'appeler d[a], j'obtiens un message d'erreur (KeyError), puisque seules les touches m, s, i et p existe et la clé n'a pas été initialisé. Mais dans un defaultdict, il prend un nom de fonction en tant qu'argument, lorsque vous essayez d'utiliser une clé qui n'a pas été initialisé, il appelle simplement la fonction que vous avez passé et assigne sa valeur de retour la valeur de la nouvelle clé.

-9voto

Andreas Jung Points 1

La documentation et l'explication sont assez explicites:

http://docs.python.org/library/collections.html#collections.defaultdict

La fonction de type (int / str etc.) passée en argument est utilisée pour initialiser une valeur par défaut pour toute clé donnée lorsque la clé n'est pas présente dans le dict.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X