Ein Dictionary im Dictionary

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.
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

Ein Dictionary im Dictionary

Beitragvon marco_ » Freitag 22. April 2005, 17:54

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?
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Re: Ein Dictionary im Dictionary

Beitragvon jens » Freitag 22. April 2005, 18:09

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...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Samstag 23. April 2005, 01:13

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
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

Beitragvon marco_ » Samstag 23. April 2005, 09:49

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.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Samstag 23. April 2005, 12:38

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

Beitragvon marco_ » Samstag 23. April 2005, 17:44

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Samstag 23. April 2005, 18:35

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.

Wer ist online?

Mitglieder in diesem Forum: Astorek