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}}}
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'}}}
Ich werde diesen Abschnitt hinzufügen, wenn ich Zeit habe. .. ..
Recommended Posts