Geordneter Schlüssel - Wert 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
nvidia
User
Beiträge: 31
Registriert: Freitag 11. Februar 2011, 16:46

Donnerstag 17. März 2011, 15:30

Hallo,
ich muss so etwas speichern:

Code: Alles auswählen

'1' : 'hallo'
'1.2.3.4.5.6' : 'huhu'
'1.2.3.4.7.8' : (5, 3, 'huhu')
'2.2' : 'Welt'
jetzt hab ich die werte der reihe nach als dict eingelesen, aber manche werden später nochmal verändert.
Dadurch ( nehm ich mal an ) entsteht dann eine ungeordnete Liste
Gibst da irgendwas geeigneteres oder ne leichte Möglichkeit, das nochmal nach zuordnen?
Lopt
User
Beiträge: 9
Registriert: Freitag 11. März 2011, 09:36

Donnerstag 17. März 2011, 15:39

Dictionarys sind ungeordnet, es gibt kein erstes oder zweites Element wie bei einer Liste.
Du kannst auch nicht auf das erste oder zweite zugreifen, du kannst nur mit dem Schlüssel zugreifen.

Vermutlich iterierst du durch die Schlüssel durch und bekommst da ungeordnet die Sachen heraus, das ist normal.

Eine Idee wäre für dich wäre

Code: Alles auswählen

MyKeys = MyDict.keys()
MyKeys.sort()
Dann hast du eine geordnete liste (MyKeys) mit den Schlüsseln des Dictionary.
Durch die geordnete Liste kannst du dann iterieren.

Edit: Ich weiß natürlich nicht, ob sort genau so sortiert, wie du es gern hättest -
ggf selbst eine Funktion schreiben die so sortiert
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Donnerstag 17. März 2011, 15:48

Neuderdings gibt's auche ein OrderedDict. :-)
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
DasIch
User
Beiträge: 2540
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Donnerstag 17. März 2011, 15:53

Das OrderedDict kann man allerdings nicht in-place sortieren, wordurch sortieren was den Speicherverbrauch angeht recht teuer wird.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Donnerstag 17. März 2011, 17:06

Wo ich das Tupel da oben sehe: Hängt das mit diesem Thread zusammen? Wenn ja würde ich mal vorsichtig nachfragen, inwiefern diese Struktur zum einen semantisch und zum anderen syntaktisch vorgegeben ist? Sollte man da in der Wahl frei sein, so könnte man da vermutlich einen leichteren Weg in beider Hinsicht finden.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
nvidia
User
Beiträge: 31
Registriert: Freitag 11. Februar 2011, 16:46

Donnerstag 17. März 2011, 18:19

Ja hängt damit zusammen,
ich versuche die Bodystructure einer Email zu parsen.

Code: Alles auswählen

Beispiel :
'(
	("TEXT" "PLAIN" ("CHARSET" "utf-8") NIL NIL "QUOTED-PRINTABLE" 871 27 NIL NIL NIL)
	(
		("TEXT" "HTML" ("CHARSET" "utf-8") NIL NIL "QUOTED-PRINTABLE" 2275 29 NIL NIL NIL)
		("APPLICATION" "VND.OASIS.OPENDOCUMENT.TEXT" ("NAME" "Ethische Problemfelder.odt") NIL NIL "BASE64" 875794 NIL ("ATTACHMENT" ("FILENAME" "Ethische Problemfelder.odt")) NIL)
		("TEXT" "HTML" ("CHARSET" "utf-8") NIL NIL "7BIT" 92 0 NIL NIL NIL) "MIXED" ("BOUNDARY" "Apple-Mail-4-784936864") NIL NIL
	) "ALTERNATIVE" ("BOUNDARY" "Apple-Mail-3-784936862") NIL NIL
)'

Code: Alles auswählen

würde jetzt bei mir werden zu :
{
'1' : [("TEXT","PLAIN",("CHARSET","utf-8"), None, None, "QUOTED-PRINTABLE" ,871 ,27 , None, None, None)]
'2' :  ["ALTERNATIVE",("BOUNDARY", "Apple-Mail-3-784936862") , None, None]
'2.1' : [("TEXT", "HTML", ("CHARSET", "utf-8"), None, None ,"QUOTED-PRINTABLE", 2275 ,29, None, None, None)]
'2.2' : [("APPLICATION" ,"VND.OASIS.OPENDOCUMENT.TEXT", ("NAME" "Ethische Problemfelder.odt"), None, None, "BASE64", 875794, None,  ("ATTACHMENT", ("FILENAME", "Ethische Problemfelder.odt")), None)]
'2.3' : [("TEXT", "HTML", ("CHARSET", "utf-8") , None, None, "7BIT", 92 ,0 , None, None, None), "MIXED" ,("BOUNDARY" ,"Apple-Mail-4-784936864") , None, None]
}
Und die Zahlen sind die Nummer, mit denen man die Teile sich abholen kann.
Ich muss jetzt da für jeden inhalt DER REIHE NACH überprüfen:
wenn der inhalt ein einziges tuple ist, dann ist es ein Teil des Körpers
wenn der inhalt nur list ist, dann ist es eine Gruppe und beinhaltet die Eigenschaften für die Gruppe
(Also Gruppe 2 ist eine Alternative für 1)
Ist das so gut, oder hättest du da einen besseren Weg um dahin zu kommen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 17. März 2011, 18:54

Was hast du da immer für komische Common Lisp-Datenstrukturen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Donnerstag 17. März 2011, 19:07

@nvidia: Das ist eine Baumstruktur, also könnte man die auch in eine Baumstruktur aus Objekten umwandeln und die mit den entsprechenden Methoden versehen um darüber zu traversieren.
Antworten