Umgestalten von einem 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.
Antworten
Stefan77
User
Beiträge: 4
Registriert: Donnerstag 6. März 2008, 17:47

Donnerstag 6. März 2008, 17:57

Hallo

Ich habe folgendes Problem:

Ich habe ein Dictionary, das so aufgebaut ist dict={ 1: [v1_1, v2_1, v3_1], 2: [v1_2, v2_2, v3_2], 3: [......], 4:....}

Aussehen sollte es aber so: dict={ 1: [v1_1,v2_1,v3_1,v4_1,...., v1_i], 2: [v2_1, v2_2,...v2_i], 3: [v3_1, v3_2,...., v3_i].

Kann mir da einer helfen?

mfg
Stefan
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Donnerstag 6. März 2008, 18:09

Also zum einen musst Du das schon per Hand umsortieren und zum anderen verstehe ich die Konzeption dahinter nicht! Sicher, dass das so aussehen soll?

Und die "v_*" sind hier keine Bezeicher sondern jetzt nur Platzhalter hoffe ich?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 6. März 2008, 18:10

Hallo Stefan77, willkommen im Forum,

hat es irgendeinen Grund, warum du so eine sinnlose Struktur mit einem Dictionary versuchst zu machen?

Außerdem verstehe ich nicht wie du vom ersten auf das zweite kommst. Beim Key 1 hast du erst v<nummer>_1 und dann v1_<nummer> wohingegen bei den Restlichen v<key_nummer>_<nummer> ist.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Stefan77
User
Beiträge: 4
Registriert: Donnerstag 6. März 2008, 17:47

Donnerstag 6. März 2008, 19:00

Das sind Meßdaten.

Das sind 3 Variablen (stehen im obersten dict als Value) und i Durchläufe (das ist im ersten dict der key). Zur Weiterverarbeitung wäre es aber besser, wenn die nach den Variablen geordnet wären und nicht nach den Durchläufen.
Ich bekomme das erste dict, in dem ich eine ASCII-Datei auslese und diese in ein dict schreibe.
Der Aufbau der ASCII-Datei ist eben eine Matrix, in dem die Spalten die Value sind und die Reihe die Durchläufe (also hier viele Reihen und 3 Spalten).

Besser zur Weiterverarbeitung wäre aber folgender Aufbau:
{Variable1 : [m1, m2, m3,....., mi], Variable2 : [n1,n2,n3,....ni], Variable3 : [o1,o2,o3,....oi]}

Die Variable1 hat also die m als Meßdaten geliefert, die Variable2 die n,...
Die Reihenfolge in der Liste ist demzufolge auch sehr wichtig.

Aber vielleicht ist schon der Ansatz von mir falsch, das erst in ein anderes dict zu schreiben, allerdings ging das so einfach 8)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Donnerstag 6. März 2008, 19:06

Wenn Du die Daten eh aus einer Datei einliest, dann lies sie doch gleich so ein, wie Du das haben willst? *wunder*
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 6. März 2008, 19:22

Stefan77 hat geschrieben:Die Reihenfolge in der Liste ist demzufolge auch sehr wichtig.
Dann warum nutzt du dort statt einer Liste ein ungeordnetes Dictionary?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Holzdolph
User
Beiträge: 23
Registriert: Donnerstag 22. November 2007, 17:43

Donnerstag 6. März 2008, 19:36

also ich als python n00b würde das so machen:

Code: Alles auswählen

a = {1:['v1_1','v2_1','v3_1'],2:['v1_2','v2_2','v3_2'],3:['v1_3','v2_3','v3_3']}
b = a.values()
d=[]
e={}

for i in range(len(a.keys())):
	for h in range(len(b[1])):
		d.append(b[h][i])
	e[i+1]=d[:]
	d = []

wobei du natürlich werte statt meinen strings hast aber wenns dir nur um die position geht ist das mal egal.

obwohl ich davon ausgegangen bin das du einen fehler in deiner angabe gemacht hast, also statt:
Ich habe ein Dictionary, das so aufgebaut ist dict={ 1: [v1_1, v2_1, v3_1], 2: [v1_2, v2_2, v3_2], 3: [......], 4:....}

Aussehen sollte es aber so: dict={ 1: [v1_1,v2_1,v3_1,v4_1,...., v1_i], 2: [v2_1, v2_2,...v2_i], 3: [v3_1, v3_2,...., v3_i].
habe ich das so aufgefasst:
quelle = { 1: [v1_1, v2_1, v3_1], 2: [v1_2, v2_2, v3_2], 3: [......], 4:....}

ziel ={ 1: [v1_1,v1_2,v1_3,v1_4,...., v1_i], 2: [v2_1, v2_2,...v2_i], 3: [v3_1, v3_2,...., v3_i].

was ja auch das v1_i in der ersten liste vermuten lässt...
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 7. März 2008, 08:21

Stefan77 hat geschrieben:Das sind Meßdaten.
...
Der Aufbau der ASCII-Datei ist eben eine Matrix, in dem die Spalten die Value sind und die Reihe die Durchläufe (also hier viele Reihen und 3 Spalten).
Zeig doch mal einen Ausschnitt aus den original Daten...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Freitag 7. März 2008, 09:12

@Holzdolph: Argh! Bitte nochmal neu schreiben: Ohne `range()` und `len()`. Man kann in Python direkt über die Elemente von Listen und die Schlüssel von Dictionaries iterieren.

Wenn man `d` am Anfang der äusseren Schleife an die leere Liste bindet, braucht man das vor der Schleife nicht zu tun. Und die Kopie ist auch sinnfrei.
Holzdolph
User
Beiträge: 23
Registriert: Donnerstag 22. November 2007, 17:43

Freitag 7. März 2008, 11:31

BlackJack hat geschrieben:@Holzdolph: Argh! Bitte nochmal neu schreiben: Ohne `range()` und `len()`. Man kann in Python direkt über die Elemente von Listen und die Schlüssel von Dictionaries iterieren.
also fürs dictionary kann man ja a.iterkeys() nehmen aber für die liste brauch ich doch die indizes und nicht deren wert. zumindest mit den 2 for- schleifen komm ich da auf keine andere lösung als:

Code: Alles auswählen

a = {1:['v1_1','v2_1','v3_1'],2:['v1_2','v2_2','v3_2'],3:['v1_3','v2_3','v3_3']}
b = a.values()
e={}

for i in a.iterkeys():
    d = []
    for k in range(len(b[i-1])):
        d.append(b[k][i-1])
    e[i]=d
     
print a
print e
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Freitag 7. März 2008, 12:38

Tipp: enumerate

Code: Alles auswählen

    enumerate(iterable) -> iterator for index, value of iterable

Return an enumerate object.  iterable must be an other object that supports
iteration.  The enumerate object yields pairs containing a count (from
zero) and a value yielded by the iterable argument.  enumerate is useful
for obtaining an indexed list: (0, seq[0]), (1, seq[1]), (2, seq[2]), ...
Edit: Habe jetzt erst verstanden was das Ding da oben machen soll.
Du brauchst ja nichtmal enumerate. Du kannst auch über die items() eines Dictionaries iterieren. Dann entfällt der ganze Listenkram.
Stefan77
User
Beiträge: 4
Registriert: Donnerstag 6. März 2008, 17:47

Freitag 7. März 2008, 17:39

Ich hab das heute auf der Arbeit hinbekommen.
Meine Lösung war so ähnlich wie die von Holzdolph auch mit zwei for-Schleifen. Leider hab ich grad den Code nicht zur Hand.

Vielen Dank für eure Mühe
Antworten