[PYTHON] Comment créer un dictionnaire avec une structure hiérarchique.

Peut-il être mis en œuvre en 5 secondes?

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}}}

Tu ne peux pas le faire en cinq secondes

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'}}}

Pourquoi ça marche?

J'ajouterai cette section si j'ai le temps. .. ..

Recommended Posts

Comment créer un dictionnaire avec une structure hiérarchique.
Comment convertir un objet de classe en dictionnaire avec SQLAlchemy
Comment faire un jeu de tir avec toio (partie 1)
Comment faire une traduction japonais-anglais
Comment créer un bot slack
Comment créer un robot - Avancé
Comment créer une fonction récursive
[Blender] Comment créer un plug-in Blender
Comment créer un robot - Basic
Comment créer un BOT Cisco Webex Teams à l'aide de Flask
Comment convertir un tableau en dictionnaire avec Python [Application]
Comment faire un simple jeu Flappy Bird avec Pygame
Comment créer un indicateur personnalisé Backtrader
Comment créer un plan de site Pelican
Comment faire une commande pour lire le fichier de paramètres avec pyramide
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
Comment lire un fichier CSV avec Python 2/3
Comment envoyer un message à LINE avec curl
Comment dessiner un graphique à 2 axes avec pyplot
Comment développer une application de panier avec Django
Je veux faire un jeu avec Python
Essayez de créer un code de "décryptage" en Python
Comment créer un plug-in QGIS (génération de package)
J'ai lu "Comment créer un laboratoire de piratage"
Comment utiliser le dictionnaire {}
Essayez de créer un groupe de dièdre avec Python
Procédure de création d'application multi-plateforme avec kivy
Une nouvelle forme d'application qui fonctionne avec GitHub: Comment créer des applications GitHub
Comment convertir / restaurer une chaîne avec [] en python
[Python] Comment dessiner un graphique linéaire avec Matplotlib
Faisons un outil de veille de commande avec python
Expliquez en détail comment créer un son avec python
Comment créer un sous-menu avec le plug-in [Blender]
Comment obtenir un utilisateur connecté avec les forms.py de Django
Comment écrire un type liste / dictionnaire de Python3
Créer une fonction pour décrire les polices japonaises avec OpenCV
Comment créer un package Python à l'aide de VS Code
Comment créer un serveur HTTPS avec Go / Gin
Bases de PyTorch (2) -Comment créer un réseau de neurones-
[Analyse morphologique] Comment ajouter un nouveau dictionnaire à Mecab
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
[Python] Comment dessiner un diagramme de dispersion avec Matplotlib
Ajouter un dictionnaire à MeCab
Comment appeler une fonction
Rendre avec la syntaxe facile
Comment mettre à jour avec SQLAlchemy?
Comment lancer avec Theano
Comment pirater un terminal
Faites une loterie avec Python
Comment modifier avec SQLAlchemy?
Comment séparer les chaînes avec ','
Comment faire RDP sur Fedora31
Comment supprimer avec SQLAlchemy?
Faire un feu avec kdeplot
Comment créer une figure géométrique 3D en un clic [Du cône triangulaire à la fractale]
Comment déployer une application Web créée avec Flask sur Heroku
Comment mettre un lien hypertexte vers "file: // hogehoge" avec sphinx-> pdf
Comment installer NPI + envoyer un message à la ligne avec python