446 votes

defaultdict de defaultdict ?

Existe-t-il un moyen d'avoir un defaultdict(defaultdict(int)) afin de faire fonctionner le code suivant ?

for x in stuff:
    d[x.a][x.b] += x.c_int

d doit être construit de manière ad-hoc, en fonction de x.a y x.b éléments.

Je pourrais utiliser :

for x in stuff:
    d[x.a,x.b] += x.c_int

mais alors je ne pourrais pas l'utiliser :

d.keys()
d[x.a].keys()

7 votes

Voir question similaire Quelle est la meilleure façon d'implémenter des dictionnaires imbriqués en Python ? . Vous trouverez également des informations utiles dans l'article de Wikipedia sur Autovivification .

6voto

Steven Rumbalski Points 16838

D'autres ont répondu correctement à votre question sur la façon de faire fonctionner ce qui suit :

for x in stuff:
    d[x.a][x.b] += x.c_int

Une alternative serait d'utiliser des tuples pour les clés :

d = defaultdict(int)
for x in stuff:
    d[x.a,x.b] += x.c_int
    # ^^^^^^^ tuple key

L'avantage de cette approche est qu'elle est simple et peut être facilement étendue. Si vous avez besoin d'un mappage à trois niveaux de profondeur, il suffit d'utiliser un tuple de trois éléments pour la clé.

4 votes

Cette solution signifie qu'il n'est pas simple d'obtenir la totalité de d[x.a], car il faut introspecter chaque clé pour voir si elle a x.a comme premier élément du tuple.

5 votes

Si vous voulez une imbrication à 3 niveaux de profondeur, alors définissez-la simplement comme 3 niveaux : d = defaultdict(lambda : defaultdict( lambda : defaultdict(int)))

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