Seite 1 von 1

Ein Dictionary im Dictionary

Verfasst: Freitag 22. April 2005, 17:54
von marco_
Dictionarys sind ja schön und gut, wenn man versteht sie zu benutzen...
Ein Dictionary als Value eines Keys zu speichern ist nicht schwer, es ist sogar möglich einem Key des neuen Dictionarys wieder ein Dictionary zuzuweißen. Alles schön und gut, aber wie navigiere icht durch die "UnterDictionarys"?? z.B.:

e = {"Eins":{"Zwei":"Drei","Vier":{"Fünf":"Sechs"}}}

wie kann ich jetzt den Wert von Fünf abfragen??


Bzw.
Ist es sinnvoller ein Dictionary in kleinere Dictionarys einzuteilen wenn man von dem Dictionary nur pro Start, einzelne Keys braucht, und die anderen unbenutzt bleiben? Sodass man nur die benötigten Keys entpicklet. Oder verbraucht ein Dictionary so wenig speicher, sodass das gar nicht auffallen würde?

Re: Ein Dictionary im Dictionary

Verfasst: Freitag 22. April 2005, 18:09
von jens
marco_ hat geschrieben:Alles schön und gut, aber wie navigiere icht durch die "UnterDictionarys"?? z.B.:
e = {"Eins":{"Zwei":"Drei","Vier":{"Fünf":"Sechs"}}}

Code: Alles auswählen

print e["Eins"]
print e["Eins"]["Zwei"]
print e["Eins"]["Vier"]["Fünf"]

Code: Alles auswählen

{'Vier': {'F\xfcnf': 'Sechs'}, 'Zwei': 'Drei'}
Drei
Sechs
Das ist so'n Sache mit dem verschachteln :? Maß muß da immer einen Überblick über die Struktur behalten...

Verfasst: Samstag 23. April 2005, 01:13
von CM
marco_ hat geschrieben: Ist es sinnvoller ein Dictionary in kleinere Dictionarys einzuteilen wenn man von dem Dictionary nur pro Start, einzelne Keys braucht, und die anderen unbenutzt bleiben? Sodass man nur die benötigten Keys entpicklet. Oder verbraucht ein Dictionary so wenig speicher, sodass das gar nicht auffallen würde?
Kommt auf Deine Anwendung an: Überlege Dir ob Du die Funktionalität eines dicts wirklich brauchst. Dann steht natürlich nichts dagegen ein Dictionary zu verwenden; dazu sind sie schließlich da.
Einen Einwand habe ich allerdings doch: Wenn man viele dicts braucht, muß man ja wohl mit vielen Daten umgehen. Ich habe das neulich mal tun müssen (wird wohl hoffentlich bald publiziert) und mir viel auf, daß die Anwendung doch ziemlich langsam wird. Also: Wenn Deine Daten nicht gut durch die Struktur eines Dicts abzubilden sind, dann lass es bleiben. Keinesfalls würde ich ein dict in kleinere unterteilen, wenn das tatsächlich nicht erforderlich ist. Denke mal über Deine erste Frage nach: Was mußt Du machen, um Deinen Code flexibel zu machen? Gleich irgendwelche Einschränkungen machen?
Poste lieber Dein Problem, vielleicht fällt jemandem etwas Besseres ein als verschachtelte dicts.

Gruß,
Christian

Verfasst: Samstag 23. April 2005, 09:49
von marco_
Das Programm ist immernoch das Vokabel-Programm. Ich dachte mir, ich nehm keine Textdateien sondern ein gepickletes Dictionary, das eigentlich den Aufabu haben sollte:
{Sprache:{1:{"Wort":Wort,"Sprache":Sprache,"Anderes":Anderes},2:{..},3..{}},Sprache2:{...}}
Das hat den Vorteil das man nicht immer den gleichen Aufbau hat sondern einmal mehr und einmal weniger Keys pro Wort existieren können, was dann mit has_key ermittelt wird.

Verfasst: Samstag 23. April 2005, 12:38
von gerold
marco_ hat geschrieben: Ich dachte mir, ich nehm keine Textdateien sondern ein gepickletes Dictionary, das eigentlich den Aufabu haben sollte:
{Sprache:{1:{"Wort":Wort,"Sprache":Sprache,"Anderes":Anderes},2:{..},3..{}},Sprache2:{...}}
Das hat den Vorteil das man nicht immer den gleichen Aufbau hat sondern einmal mehr und einmal weniger Keys pro Wort existieren können, was dann mit has_key ermittelt wird.
Hi Marco!

Dann wären wir aber wieder bei YAML. Das hat gegenüber pickle den Vorteil, dass es menschenlesbar bleibt und leicht verändert werden kann. Und das mit einem geringeren Schreibaufwand als bei XML.

Die gesamte Struktur des Dictionaries, wie man dieses in ein YAML-File schreibt und wie man dieses Dictionary wieder aus dem YAML-File ausliest habe ich bereits im Thema "Wie am besten Datei aufbauen?" ausführlich gepostet.

Aber hier noch mal eine Kurzzusammenfassung (diesmal alles in einer Liste):

Code: Alles auswählen

import yaml
import pprint

datalist = [
   {
      'de': [
         {
            'begr': 'Deutscher Begriff 1'
         },
         {
            'hinw': 'Hier könnte ein Hinweis stehen',
            'begr': 'Möglicher zweiter, deutscher Begriff'
         }
      ],
      'en': [
         {
            'begr': 'Englischer Begriff 1',
            'laut': 'Hier könnte ein Lautsprachenausdruck stehen'
         },
         {
            'tipp': 'Hier könnte ein Tipp stehen',
            'begr': 'Englischer Begriff 2'
         },
         {
            'hinw': 'Hier könnte wieder mal ein Hinweis stehen',
            'begr': 'Englischer Begriff 3', 
            'tipp': 'Noch ein Tipp dazu'
         }
      ]
   },
   {
      'de': [
         {
            'begr': 'Deutscher Begriff 1'
         },
         {
            'hinw': 'Hier könnte ein Hinweis stehen',
            'begr': 'Möglicher zweiter, deutscher Begriff'
         }
      ],
      'en': [
         {
            'begr': 'Englischer Begriff 1',
            'laut': 'Hier könnte ein Lautsprachenausdruck stehen'
         },
         {
            'tipp': 'Hier könnte ein Tipp stehen',
            'begr': 'Englischer Begriff 2'
         },
         {
            'hinw': 'Hier könnte wieder mal ein Hinweis stehen',
            'begr': 'Englischer Begriff 3', 
            'tipp': 'Noch ein Tipp dazu'
         }
      ]
   }
]

print 
print "originalliste:"
pprint.pprint(datalist)

# yaml-datei erzeugen
f = file(r"C:\yamltest.yml", "w")
dumper = yaml.Dumper()
dumper.indent = "   "
y = dumper.dump(datalist)
f.write(y)
f.close()

print 
print "inhalt des yaml-files:"
print y

# yaml-datei auslesen
new_datalist = yaml.loadFile(r"C:\yamltest.yml").next()

print
print "vom yaml-file ausgelesene liste:"
pprint.pprint(new_datalist)
Sollte nur mal zum Denken anregen. :wink:

lg
Gerold
:-)

Verfasst: Samstag 23. April 2005, 17:44
von marco_
Danke, hab mich jetzt endlich durchgerungen und mich mit yaml einigermaßen auseinandergesetzt. Hab das Programm neu auf Yaml-Basis geschrieben und es funktioniert perfekt. :D

Verfasst: Samstag 23. April 2005, 18:35
von gerold
marco_ hat geschrieben: Danke, hab mich jetzt endlich durchgerungen und mich mit yaml einigermaßen auseinandergesetzt.
Hi Marco!
Mir war klar, dass du dich vorher mit Dictionaries und Listen auseinandersetzen mußt. :)
Es freut mich, wenn es funktioniert.

lg
Gerold
:-)