Seite 1 von 1
Verschachtelte Tupel und Dicts textuell speichern
Verfasst: Mittwoch 21. März 2018, 19:08
von catlover123
Hallo!
Ich habe eine Baumstruktur (BK-Trees) in folgender Form gespeichert:
( word, {int : (word, {int : (word, {})}), ...)
hier nochmal ein kleines Beispiel:
Code: Alles auswählen
tree = ('Buch', {3: ('Baum', {}), 4: ('Tier', {5: ('Wurst', {4: ('Blatt', {})}), 4: ('Haus', {1: ('Maus', {}), 3: ('Darm', {})})}), 2: ('Lauch', {}), 7: ('Zwiebel', {}), 5: ('Essen', {})})
Ich möchte diese Baumstruktur in einer .txt Datei so speichern, dass ich sie später möglichst einfach wieder einlesen kann um den Baum nicht jedesmal neu aufbauen zu müssen. Ich erwarte keine Lösung nur ein paar Denkanstöße, weil ich wirklich keine Idee mehr habe wie man solch eine verschachtelte Struktur am besten abspeichern sollte. :K
Schonmal vielen Dank für eure Tipps!
Re: Verschachtelte Tupel und Dicts textuell speichern
Verfasst: Mittwoch 21. März 2018, 19:14
von noisefloor
Hallo,
... und willkommen im Forum
Eine Text-Datei ist die schlechteste Lösung, weil da wirklich nur Text drin steht. Beim Einlesen bekommst du pro Zeilen einen String. Und den bei der Struktur zurück in eine Dict/Tupel zu wandeln, ist mühsam.
Besser wäre: JSON oder das shelve-Modul oder das pickle-Modul. Sind alles Standardmodule, die Python an Bord hat.
Gruß, noisefloor
Re: Verschachtelte Tupel und Dicts textuell speichern
Verfasst: Donnerstag 22. März 2018, 11:21
von skirnir
Hallo,
vielleicht ist noch interessant, dass json per default deine Tupel zu Listen und deine Integers zu Strings macht:
Code: Alles auswählen
In [22]: tree
Out[22]:
('Buch',
{2: ('Lauch', {}),
3: ('Baum', {}),
4: ('Tier',
{4: ('Haus', {1: ('Maus', {}), 3: ('Darm', {})}),
5: ('Wurst', {4: ('Blatt', {})})}),
5: ('Essen', {}),
7: ('Zwiebel', {})})
In [23]: json.loads(json.dumps(tree))
Out[23]:
['Buch',
{'2': ['Lauch', {}],
'3': ['Baum', {}],
'4': ['Tier',
{'4': ['Haus', {'1': ['Maus', {}], '3': ['Darm', {}]}],
'5': ['Wurst', {'4': ['Blatt', {}]}]}],
'5': ['Essen', {}],
'7': ['Zwiebel', {}]}]
Das kann man zwar konfigurieren (ich habe gerade nicht präsent, wie genau), aber meines Wissens stößt du da an deine Grenzen, wenn das ursprüngliche Objekt sowohl Tupel als auch Listen enthält. Pickle erhält die jeweiligen Typen:
Code: Alles auswählen
In [4]: pickle.loads(pickle.dumps(tree))
Out[4]:
('Buch',
{2: ('Lauch', {}),
3: ('Baum', {}),
4: ('Tier',
{4: ('Haus', {1: ('Maus', {}), 3: ('Darm', {})}),
5: ('Wurst', {4: ('Blatt', {})})}),
5: ('Essen', {}),
7: ('Zwiebel', {})})
Re: Verschachtelte Tupel und Dicts textuell speichern
Verfasst: Donnerstag 22. März 2018, 11:42
von DeaD_EyE
Integer bleibt Integer und Float bleibt Float.
Einfach mal hier nachlesen wie das Mapping der Datentypen ist:
https://docs.python.org/3.6/library/jso ... d-decoders
Re: Verschachtelte Tupel und Dicts textuell speichern
Verfasst: Donnerstag 22. März 2018, 12:09
von skirnir
Hat im Beispiel vermutlich damit zu tun, dass die Integers als dictionary keys benutzt werden.
Re: Verschachtelte Tupel und Dicts textuell speichern
Verfasst: Donnerstag 22. März 2018, 13:12
von Sirius3
JSON kennt nur Strings als Dictionary-Keys. Pickel hat den Nachteil, dass es sehr kryptisch ist und sensitiv auf Änderungen am Programmcode (Bei reinen Listen und Wörterbüchern jetzt nicht das Problem). Am saubersten ist es, eine Klasse für Deinen Baum zu schreiben, die explizit Serialisierungsmethoden hat, z.B. nach JSON.
Re: Verschachtelte Tupel und Dicts textuell speichern
Verfasst: Donnerstag 22. März 2018, 15:19
von DeaD_EyE
Stimmt!111ellf:
In [8]: json.loads(json.dumps({1:2,3:4}))
Out[8]: {'1': 2, '3': 4}
Wusste ich gar nicht, da ich bis jetzt noch nie Integer als Key verwendet habe.
Schonmal darüber nachgedacht eine Datenbank zu nutzen? In Python ist sqlite3 standardmäßig integriert.
Für den Anfang würde das ja reichen.