[PYTHON] So erstellen Sie ein Wörterbuch mit einer hierarchischen Struktur.

Kann es in solchen 5 Sekunden implementiert werden?

Ein Junior A fragte mich: "Ich möchte ein Wörterbuch mit einer hierarchischen Struktur in Python erstellen." Natürlich, "Jean schafft das in fünf Sekunden" Ich dachte. Am Ende dauerte es jedoch 30 Minuten, um die Frage zu beantworten. Ich habe ungefähr 30 Minuten damit verbracht, es zu erklären. Wenn Sie aufgefordert werden, es zu implementieren, werden Sie es auch vergessen, daher möchte ich es als Memo behalten.

Erstens lautet die Frage Ihres Junior nicht nur, ob Sie ein doppelt oder dreifach strukturiertes Wörterbuch erstellen möchten, sondern Sie erhalten die folgenden Eingaben.

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

Er wollte automatisch das folgende hierarchische Wörterbuch erstellen.

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

Sie können es nicht in fünf Sekunden tun

Ich hatte es also schwer damit. Das erste, was ich mir ausgedacht habe, war die Verwendung von defaultdict.

import collections
hoge = collections.defaultdict(lambda : collections.defaultdict(lambda : collections.defaultdict(int))

Sie können ein dreifach verschachteltes Diktat erstellen, indem Sie einen Lambda-Ausdruck wie diesen verwenden. Jedoch. Diese Methode ist subtil. Erstens ist es notwendig, die Anzahl der Hierarchien im Voraus zu kennen, und die Anzahl der Hierarchien kann je nach Element unterschiedlich sein, so dass es nicht sehr allgemein ist. Darüber hinaus ist es schwierig, das Standarddikt zu ermitteln, das den Standardwert im Lambda-Ausdruck definiert. Ich dachte über die folgende Methode nach.

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) 

Wenn Sie das obige Programm tatsächlich ausführen, können Sie die Ausgabe des hierarchischen Diktats wie oben gezeigt erhalten. Es ist ein seltsames Programm, dass der Inhalt von tree_dict aktualisiert wird, obwohl er nie direkt tree_dict zugewiesen wird, aber es funktioniert. Ich dachte, ich würde einen Kommentar posten, aber ich habe keine Zeit, also dieses Mal ...

Im Übrigen kann das obige Skript auf Eingaben mit unterschiedlicher Anzahl von Ebenen für jedes Element angewendet werden, wie unten gezeigt.

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

Sie können ein Diktat wie dieses bekommen

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

Warum funktioniert es?

Ich werde diesen Abschnitt hinzufügen, wenn ich Zeit habe. .. ..

Recommended Posts

So erstellen Sie ein Wörterbuch mit einer hierarchischen Struktur.
So konvertieren Sie ein Klassenobjekt mit SQLAlchemy in ein Wörterbuch
Wie man ein Schießspiel mit toio macht (Teil 1)
Wie erstelle ich eine japanisch-englische Übersetzung?
Wie man einen lockeren Bot macht
Wie erstelle ich einen Crawler?
So erstellen Sie eine rekursive Funktion
[Blender] So erstellen Sie ein Blender-Plug-In
Wie erstelle ich einen Crawler?
So erstellen Sie mit Flask einen BOT für Cisco Webex-Teams
So konvertieren Sie mit Python [Anwendung] von einem Array in ein Wörterbuch
Wie man ein einfaches Flappy Bird-Spiel mit Pygame macht
So erstellen Sie einen benutzerdefinierten Backtrader-Indikator
Wie erstelle ich eine Pelican Site Map?
So erstellen Sie einen Befehl zum Lesen der Einstellungsdatei mit Pyramide
So erstellen Sie eine Überwachungskamera (Überwachungskamera) mit Opencv und Python
Lesen einer CSV-Datei mit Python 2/3
So senden Sie eine Nachricht mit Curl an LINE
So zeichnen Sie ein 2-Achsen-Diagramm mit Pyplot
So entwickeln Sie eine Cart-App mit Django
Ich möchte ein Spiel mit Python machen
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
So erstellen Sie ein QGIS-Plug-In (Paketerzeugung)
Ich las "Wie man ein Hacking Lab macht"
Verwendung des Wörterbuchs {}
Versuchen Sie, mit Python eine Diedergruppe zu bilden
Verfahren zur Erstellung plattformübergreifender Apps mit kivy
Eine neue Form der App, die mit GitHub funktioniert: So erstellen Sie GitHub-Apps
So konvertieren / wiederherstellen Sie einen String mit [] in Python
[Python] Wie zeichnet man mit Matplotlib ein Liniendiagramm?
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
Erklären Sie ausführlich, wie Sie mit Python einen Sound erzeugen
So erstellen Sie ein Untermenü mit dem Plug-In [Blender]
So erhalten Sie einen angemeldeten Benutzer mit Djangos forms.py
So schreiben Sie einen Listen- / Wörterbuchtyp von Python3
Erstellen Sie mit OpenCV eine Funktion zum Beschreiben japanischer Schriftarten
So erstellen Sie ein Python-Paket mit VS Code
So erstellen Sie einen HTTPS-Server mit Go / Gin
Grundlagen von PyTorch (2) - Wie erstelle ich ein neuronales Netzwerk?
[Morphologische Analyse] So fügen Sie Mecab ein neues Wörterbuch hinzu
[Python] So erstellen Sie mit Matplotlib ein zweidimensionales Histogramm
[Python] Wie zeichnet man mit Matplotlib ein Streudiagramm?
Fügen Sie MeCab ein Wörterbuch hinzu
So rufen Sie eine Funktion auf
Machen Sie es mit der Syntax einfach
Wie aktualisiere ich mit SQLAlchemy?
Wie man mit Theano besetzt
Wie man ein Terminal hackt
Machen Sie eine Lotterie mit Python
Wie mit SQLAlchemy ändern?
So trennen Sie Zeichenfolgen mit ','
Wie man RDP auf Fedora31 macht
Wie lösche ich mit SQLAlchemy?
Machen Sie ein Feuer mit kdeplot
So erstellen Sie eine geometrische 3D-Figur mit einem Klick [Vom dreieckigen Kegel zum Fraktal]
So stellen Sie eine mit Flask erstellte Web-App für Heroku bereit
So setzen Sie einen Hyperlink zu "file: // hogehoge" mit sphinx-> pdf
So installieren Sie NPI + Senden Sie eine Nachricht an Python