Beliebig verschachtelte Datenstruktur encodieren/decodieren

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
dahaze
User
Beiträge: 75
Registriert: Freitag 13. März 2009, 10:57
Wohnort: im Schwabenland

Hallo zusammen!

Gibt es eine Möglichkeit, eine beliebig tief verschachtelte Datenstruktur bestehend aus Strings komplett (also jedes Element einzeln) zu decodieren, bzw. encodieren? :roll:

Sozusagen bin ich auf der Suche nach einer Kombination aus "copy.deepcopy(x)" und "map(function, list, ...)"

Gibts da etwas?

Gruß,
Simon
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo!

Zeig doch mal ein aussagekräftiges und kurzes Beispiel mit der Eingabe und der erwarteten Ausgabe.

Sebastian
Das Leben ist wie ein Tennisball.
dahaze
User
Beiträge: 75
Registriert: Freitag 13. März 2009, 10:57
Wohnort: im Schwabenland

Ich versuchs mal... :-)

Die Ausgangsstruktur ist eine verschachtelte DS beliebiger Tiefe bestehend aus z.B. ISO-8859-1 codierten Strings
Bsp:

Code: Alles auswählen

l = ['\xfc\xfc\xfc', {'\xe4':'\xb0'}] 
wobei die Tiefe und der Aufbau nicht bekannt ist.

Alle Strings in dieser Struktur würde ich nun gerne in Unicode umwandeln.
Nur wie mache ich das am Geschicktesten?

Bei einer "normalen" Liste würde diese so aussehen:

Code: Alles auswählen

l2 = [s.decode('ISO8859-1') for s in l]
Gibts da vielleicht irgendeine Methode die jedes Element einer beliebig tiefen Datenstruktur behandelt?

Oder muss ich da mir rekursiv einen abprogrammieren? :cry:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sprichst Du von Objekten, die der JSON-parser zurückliefert? Sieht ja beinahe so aus...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Je nach dem wie kompliziert die Struktur ist:

Code: Alles auswählen

>>> spam = [1234, "asdf", ("asdf", {"hmpf":123, "argh":"moep"}, 2), [234, "oink", "maeh"]]
>>> def eggs(data):
...     if isinstance(data, str):
...         return data.upper()
...     try:
...         t = type(data)
...         func = {dict:dict.iteritems}.get(t, iter)
...         return t([eggs(x) for x in func(data)])
...     except TypeError:
...         return data
...
>>> eggs(spam)
[1234, 'ASDF', ('ASDF', {'ARGH': 'MOEP', 'HMPF': 123}, 2), [234, 'OINK', 'MAEH']]
Der Code hat noch die ein oder andere Schwäche, als Ansatz genügt er aber sicher.
Das Leben ist wie ein Tennisball.
dahaze
User
Beiträge: 75
Registriert: Freitag 13. März 2009, 10:57
Wohnort: im Schwabenland

Wow!

Das sieht ja schon ganz gut aus!
Sowas habe ich gesucht! Ich denke allein währ ich auf das die nächsten Stunden nicht gekommen! :D
Danke!

@Hyperion: Dass mein Beispiel der JSON Struktur ähnelt war eher Zufall... :)
Antworten