Un junior A m'a demandé: "Je veux créer un dictionnaire avec une structure hiérarchique en Python." Bien sûr, "Jean peut faire ça en cinq secondes" J'ai pensé. Mais au final, il a fallu 30 minutes pour répondre à la question. J'ai passé environ 30 minutes à l'expliquer. De plus, si on vous demande de le mettre en œuvre, vous l'oublierez, alors j'aimerais le garder comme mémo.
En premier lieu, la question de votre junior n'est pas seulement que vous souhaitez créer un dictionnaire double ou triple structuré, mais vous recevez les informations suivantes.
example.csv
A1,B1,C1,3
A1,B1,C2,1
A1,B1,C3,5
A1,B2,C1,4
A1,B2,C2,3
A1,B2,C3,1
A1,B3,C1,3
A1,B3,C2,2
A1,B3,C3,5
A2,B1,C1,3
A2,B1,C2,5
A2,B1,C3,3
A2,B2,C1,2
A2,B2,C2,1
A2,B2,C3,3
A2,B3,C1,4
A2,B3,C2,4
A2,B3,C3,5
Il voulait créer automatiquement le dictionnaire hiérarchique suivant.
{'A1': {'B1': {'C1': 1,
'C2': 1,
'C3': 3},
'B2': {'C1': 3,
'C2': 3,
'C3': 4},
'B3': {'C1': 2,
'C2': 5,
'C3': 5}},
'A2': {'B1': {'C1': 4,
'C2': 4,
'C3': 1},
'B2': {'C1': 1,
'C2': 3,
'C3': 3},
'B3': {'C1': 4,
'C2': 2,
'C3': 3}}}
Donc, j'ai eu du mal avec ça. La première chose que j'ai trouvée était de savoir comment utiliser defaultdict.
import collections
hoge = collections.defaultdict(lambda : collections.defaultdict(lambda : collections.defaultdict(int))
Vous pouvez créer un triple dict imbriqué en utilisant une expression lambda comme celle-ci. Pourtant. Cette méthode est subtile. En premier lieu, il est nécessaire de connaître le nombre de hiérarchies à l'avance, et le nombre de hiérarchies peut différer en fonction de l'élément, ce n'est donc pas très général. De plus, il est difficile de sélectionner le defaultdict qui définit la valeur par défaut dans l'expression lambda. J'ai pensé à la méthode suivante.
import pprint
def make_tree_dict(inputs):
tree_dict = {}
for i, ainput in enumerate(inputs):
pre_dict = tree_dict
for j, key in enumerate(ainput):
if j == len(ainput)-2:
pre_dict[key] = ainput[-1]
break
elif key not in pre_dict:
pre_dict[key] = {}
else:
pass
pre_dict = pre_dict[key]
return tree_dict
if __name__ == "__main__":
pp = pprint.PrettyPrinter(width=10,compact=True)
inputs = []
with open("example.csv") as f:
for line in f:
line = line.rstrip().split(",")
inputs.append(line)
hoge = make_tree_dict(inputs)
pp.pprint(hoge)
En exécutant réellement le programme ci-dessus, vous pouvez obtenir la sortie du dict hiérarchique comme indiqué ci-dessus. C'est un programme étrange que le contenu de tree_dict soit mis à jour même s'il n'est jamais directement assigné à tree_dict, mais cela fonctionne. Je pensais publier un commentaire, mais je n'ai pas le temps, alors cette fois ...
Incidemment, le script ci-dessus peut être appliqué à des entrées avec différents nombres de couches pour chaque élément, comme indiqué ci-dessous.
example2.csv
A1,B1,C1,1
A1,B1,C2,D1,3
A1,B1,C3,5
A1,B2,C1,D1,5
A1,B2,C2,2
A1,B2,C3,5
A1,B3,C1,2
A1,B3,C2,D1,4
A1,B3,C2,D2,10
A1,B3,C3,2
A2,B1,C1,4
A2,B1,C2,D1,5
A2,B1,C3,5
A2,B2,C1,D1,6
A2,B2,C2,3
A2,B2,C3,D1,8
A2,B3,C1,2
A2,B3,C2,5
A2,B3,C3,4
Vous pouvez obtenir un dict comme celui-ci
example2_output
{'A1': {'B1': {'C1': '1',
'C2': {'D1': '3'},
'C3': '5'},
'B2': {'C1': {'D1': '5'},
'C2': '2',
'C3': '5'},
'B3': {'C1': '2',
'C2': {'D1': '4',
'D2': '10'},
'C3': '2'}},
'A2': {'B1': {'C1': '4',
'C2': {'D1': '5'},
'C3': '5'},
'B2': {'C1': {'D1': '6'},
'C2': '3',
'C3': {'D1': '8'}},
'B3': {'C1': '2',
'C2': '5',
'C3': '4'}}}
J'ajouterai cette section si j'ai le temps. .. ..
Recommended Posts