Verschachtelte Tupel und Dicts textuell speichern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
catlover123
User
Beiträge: 1
Registriert: Mittwoch 21. März 2018, 18:53

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!
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
skirnir
User
Beiträge: 33
Registriert: Sonntag 25. Januar 2015, 10:59

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', {})})
Benutzeravatar
DeaD_EyE
User
Beiträge: 1020
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Integer bleibt Integer und Float bleibt Float.

Code: Alles auswählen

print(json.dumps([1, 2, 3.0], indent=4))

Code: Alles auswählen

[
    1,
    2,
    3.0
]
Einfach mal hier nachlesen wie das Mapping der Datentypen ist: https://docs.python.org/3.6/library/jso ... d-decoders
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
skirnir
User
Beiträge: 33
Registriert: Sonntag 25. Januar 2015, 10:59

Hat im Beispiel vermutlich damit zu tun, dass die Integers als dictionary keys benutzt werden.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1020
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten