Seite 1 von 1

verschachtelte liste mit integer-paaren

Verfasst: Montag 13. September 2004, 11:01
von Gast
um koordinaten aus eine datei zu verarbeiten
benötige ich noch eine konvertierung einer verschachtelten liste.
den string konnte ich bis zu dieser stelle filtern und umwandeln:

[[465,34,255,123,122,43],[144,123,78,66],[123,53,143,13]]

ich benoetige jetzt noch eine möglichst einfache loesung, um
folgende liste zu erhalten:

[[[465,34],[255,123],[122,43]],[[144,123],[78,66]],[[123,53],[143,13]]]

meine versuche hatten leider keinen erfolg :(

gruß micha

Verfasst: Montag 13. September 2004, 11:20
von Milan
Hi. Fass doch einfach die Listen zu einer einzigen zusammen und erstell daraus dann immer 2er Paare...

Code: Alles auswählen

l=[[465,34,255,123,122,43],[144,123,78,66],[123,53,143,13]]
erg=[]
for i in l:
	erg.extend(i)
erg=[erg[i:i+2] for i in xrange(0,len(erg),2)]
mfg Milan

Verfasst: Montag 13. September 2004, 12:05
von Gast
hi milan,
danke für die antwort.
ich habe leider das problem das ich diese struktur brauche:
[[[465,34],[255,123],[122,43]],[[144,123],[78,66]],[[123,53],[143,13]]]
das heißt, die zweierpaare sollten innerhalb der inneren listen
sein.
ich kann also die liste nicht zusammenführen.
die koordinanten erhalte ich aus einer datei, sind also jedesmal anders.
zur weiterverarbeitung benötige ich genau diese oben beschriebene
struktur

viele grüße micha

Verfasst: Montag 13. September 2004, 12:59
von Dookie
Hi micha,

wenn Du uns den Ursprungsstring verrätst, können wir sicher einfacher einen Parser dafür zusammenstricken, als an dem halbaufbereiteten String rumzuwursteln.

Code: Alles auswählen

daten = "465,34,255,123,122,43,144,123,78,66,123,53,143,13"
tmp = daten.split(",")
result = [[tmp[:2],tmp[2:4],tmp[4:6]],[tmp[6:8],tmp[8:10]],[tmp[10:12],tmp[12:]]]
print result
Gruß

Dookie

Verfasst: Montag 13. September 2004, 13:16
von mawe
Hi!

Es geht wahrscheinlich kaum umständlicher, aber das sollte funktionieren:

Code: Alles auswählen

liste = [[465,43,255,123,122,43],[144,123,78,66],[123,53,143,13]]

erg = []
for i in range(len(liste)):
	erg.append([])
	for j in range(0,len(liste[i]),2):
		x = liste[i][j:j+2]
		erg[i].append(x)
		
print erg
Gruß, mawe

Verfasst: Montag 13. September 2004, 13:32
von Gast
hi dokie,
vielen dank.
es handelt sich bei den strings um koordinaten von polygon-linienin einer datei.
z.B. so:
...
polyline = "23,232,232,232,23,23"
...
polyline ="123,45,133,456,122,110,10,100"
...
polyline ="123,45,133,456,122,110,10,100"

anzahl der linien und string-inhalte ist immer unterschiedlich!
die anzahl der ziffern immer gerade(koordinaten)
ich habe mit re.search (...)die stringmuster gesucht und dann
zu einem string zusammengefügt.
den dann wieder versucht zu zerlegen

gruß
micha

Verfasst: Montag 13. September 2004, 13:44
von Gast
sory dookie,
natürlich dookie, nicht dokie :)

danke dooky, danke mawe

ich glaube das hilft mir gut weiter

viele grüße
micha

Verfasst: Montag 13. September 2004, 19:18
von fs111
Anonymous hat geschrieben:hi dokie,
vielen dank.
es handelt sich bei den strings um koordinaten von polygon-linienin einer datei.
z.B. so:
...
polyline = "23,232,232,232,23,23"
...
polyline ="123,45,133,456,122,110,10,100"
...
polyline ="123,45,133,456,122,110,10,100"
Was ist denn das für ein System, wo das so dargestellt wird? Ich kenne nur polyline-Elemente, die mit x y,x y,x y etc. dargestellt werden, die Wertepaare also durch Kommata getrennt werden, und die x und y-Werte durch ein Leerzeichen. Wundert mich, dass alles durch Kommata abgetrennt werden soll.

Ich frage nur aus Interesse.

fs111

Verfasst: Montag 13. September 2004, 19:47
von Dookie

Code: Alles auswählen

liste = [[465,43,255,123,122,43],[144,123,78,66],[123,53,143,13]]

erg = []
for entry in liste:
    erg.append([[entry[i], entry[i+1]] for i in xrange(0, len(entry), 2)])
       
print erg
Gruß

Dookie

Verfasst: Montag 13. September 2004, 22:34
von Gast
hi fs111,

natürlich hast du recht, habe leider den schon separierten
string hier rein kopiert(montag ist nicht mein tag).
die ursprünglichen strings sind :
<polyline points="150,10 150,50 200,10" />
<polyline points="150,60 150,100 200,60" />
aus einer svg-datei.
ich hatte die kommas da drin, um besser atoi benutzen zu können.

hi dookie,
danke, super idee.
mit Deiner und maves hilfe ist der abend gerettet.

viele grüße micha

Verfasst: Dienstag 14. September 2004, 00:47
von Dookie
Hi nochmal,

1. mit den originaldaten ists noch einfacher, und wozu atoi? So was brauchen doch nur C/C++ coder ;)

Code: Alles auswählen

points = "150,10 150,50 200,10"
pointlist = [[float(b) for b in a.split(",")] for a in points.split()]
print pointlist

Gruß

Dookie

Verfasst: Dienstag 14. September 2004, 08:54
von fs111
Anonymous hat geschrieben:hi fs111,

natürlich hast du recht, habe leider den schon separierten
string hier rein kopiert(montag ist nicht mein tag).
die ursprünglichen strings sind :
<polyline points="150,10 150,50 200,10" />
<polyline points="150,60 150,100 200,60" />
aus einer svg-datei.
ich hatte die kommas da drin, um besser atoi benutzen zu können.
Das kam mir doch bekannt vor ;), wobei du das oben immer noch verdreht hast, mit den "," und den " ". SVG ist schon eine feine Sache, setzt sich nur leider viel zu langsam durch...

[OT]
Welchen Viewer benutzt Du zum anzeigen (adobe, Corel, Batik,ksvg)?
[/OT]

fs111

Verfasst: Dienstag 14. September 2004, 14:10
von Gast
hi fs111,

ich kenne bisher nur diese schreibweise:
<polyline points="20,70 50,100 100,100 200,150" ...
warscheinllich gibt es da verschiedene möglichkeiten.
ich benutze übrigends das adobe-plugin.
ich galube allmälig wird's sich durchsetzen.
leider sind die plugins noch nicht bei allen browsern bei.

hi dookie,

ich weis gar nicht warum ich nie auf solche einfachen dinge komme:)
ich habe vor einem monat erst mit python begonnen und kann die vorteile
(weniger code) leider noch nicht richtig nutzen.
vieleicht wirds ja bald mal besser.

viele grüße micha