2 votes

Ajouter une valeur à la clé, selon que la valeur se trouve dans une autre clé.

J'ai le dictionnaire suivant :

{'Atlanta': [['Bear', 34274], ['Deer', 13747], ['Bee', 83743]],
 'New York': [['Bear', 987], ['Dove', 2635]]}

Une clé qui a pour valeur une liste contenant des listes avec des paires d'animaux et un numéro.
Maintenant je veux que si un animal existe dans l'une des clés, je veux qu'il soit aussi dans toutes les autres clés mais avec un zéro à la place du numéro, donc le dictionnaire devrait ressembler à ceci :

{'Atlanta': [['Bear', 34274], ['Deer', 13747], ['Bee', 83743], ['Dove', 0]], 
 'New York': [['Bear', 987], ['Dove', 2635], ['Deer', 0], ['Bee', 0]]}

Je n'arrive pas à trouver comment faire. Quelqu'un peut-il m'aider ?

1voto

Mike Müller Points 2963

Trouvez d'abord tous les noms d'animaux :

d = {'Atlanta': [['Bear', 34274], ['Deer', 13747], ['Bee', 83743]], 
     'New York': [['Bear', 987], ['Dove', 2635]]}

>>> animals = {animal for value in d.values() for animal, _ in value}
>>> animals
{'Bear', 'Bee', 'Deer', 'Dove'}

et de compléter les chiffres manquants par des zéros :

for key, value in d.items():
    selected_animals = {animal for animal, _ in value}
    for name in animals - selected_animals:
        d[key].append([name, 0])

Maintenant :

>>> d
{'Atlanta': [['Bear', 34274], ['Deer', 13747], ['Bee', 83743], ['Dove', 0]],
 'New York': [['Bear', 987], ['Dove', 2635], ['Deer', 0], ['Bee', 0]]}

0voto

jpp Points 83462

Ceci est similaire à La solution parfaite de @MikeMuller . Mais je passe par pandas En effet, dans votre cas, vous souhaiterez peut-être effectuer d'autres manipulations qui sont plus faciles à réaliser avec une bibliothèque spécialisée.

Dans cet exemple, le tableau croisé dynamique produit mai est tout ce dont vous avez besoin.

import pandas as pd, numpy as np
from collections import defaultdict

d = {'Atlanta': [['Bear', 34274], ['Deer', 13747], ['Bee', 83743]],
     'New York': [['Bear', 987], ['Dove', 2635]]}

df = pd.DataFrame(columns=['Location', 'Animal', 'Number'])

for k, v in d.items():
    for i in v:
        df.loc[len(df.index)+1] = [k, i[0], i[1]]

res = pd.pivot_table(df, index='Location', columns='Animal',
                     values='Number', aggfunc=np.sum, fill_value=0).reset_index()

# Animal  Location   Bear    Bee   Deer  Dove
# 0        Atlanta  34274  83743  13747     0
# 1       New York    987      0      0  2635

d_out = defaultdict(list)

for idx, row in res.iterrows():
    for i in row.index[1:]:
        d_out[row[0]].append([i, row[i]])

# defaultdict(list,
#             {'Atlanta': [['Bear', 34274],
#               ['Bee', 83743],
#               ['Deer', 13747],
#               ['Dove', 0]],
#              'New York': [['Bear', 987],
#               ['Bee', 0],
#               ['Deer', 0],
#               ['Dove', 2635]]})

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