Seite 1 von 1

Umgestalten von einem Dictionary

Verfasst: Donnerstag 6. März 2008, 17:57
von Stefan77
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

Verfasst: Donnerstag 6. März 2008, 18:09
von Hyperion
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?

Verfasst: Donnerstag 6. März 2008, 18:10
von Leonidas
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.

Verfasst: Donnerstag 6. März 2008, 19:00
von Stefan77
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)

Verfasst: Donnerstag 6. März 2008, 19:06
von Hyperion
Wenn Du die Daten eh aus einer Datei einliest, dann lies sie doch gleich so ein, wie Du das haben willst? *wunder*

Verfasst: Donnerstag 6. März 2008, 19:22
von Leonidas
Stefan77 hat geschrieben:Die Reihenfolge in der Liste ist demzufolge auch sehr wichtig.
Dann warum nutzt du dort statt einer Liste ein ungeordnetes Dictionary?

Verfasst: Donnerstag 6. März 2008, 19:36
von Holzdolph
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...

Verfasst: Freitag 7. März 2008, 08:21
von jens
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...

Verfasst: Freitag 7. März 2008, 09:12
von BlackJack
@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.

Verfasst: Freitag 7. März 2008, 11:31
von Holzdolph
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

Verfasst: Freitag 7. März 2008, 12:38
von Zap
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.

Verfasst: Freitag 7. März 2008, 17:39
von Stefan77
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