Listeneintrag

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
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

Folgendes Problem:

ich habe eine Liste mit unterschiedlichen Einträgen (Orig_FID, Point_X, Point_Y, Point_Z) wobei die Orig_FID der ID einer Polylinie enspricht, die aus 2 Punkten begrenzt ist (Punkte durch Point_X, Point_Y, PointZ gekennzeichnet, entsprechen den XYZ-Koordinaten der Randpunkte einer Linie). Jetzt soll eine Liste erstellte werden, welche pro Tupel die FID der Linie und die Koordinaten der beiden Randpunkte enthalten sind.

Folgender Vorschlag:

Code: Alles auswählen

while row:
    current_Eintrag = (row.FID, row.FID_DREIEC, row.ORIG_FID, row.POINT_X, row.POINT_Y, row.POINT_Z)
    orig_FID=row.ORIG_FID
    liste.append(current_Eintrag)
    

    #current_coordinate = (row.POINT_X, row.POINT_Y, row.POINT_Z)
    #current_Eintrag2 = (row.ORIG_FID, current_coordinate)
   
    #Endliste.append(current_Eintrag2)
    #Koordinatenliste.append(current_coordinate)
    row = cur.next()

liste2=sorted(liste, key=lambda Dreieck: Dreieck[1])

oFID = -1  
for c in liste2:
    if oFID == c[2] or oFID == -1:
        coords_polyline.append((c[3], c[4], c[5]))
    else:
        current_Eintrag2 = (oFID, coords_polyline)
        Endliste.append(current_Eintrag2)
        del coords_polyline[:]
    oFID = c[2]
   
Das Problem, was ich jetzt habe, ist folgendes, dass die Koordinaten nicht richtig eingelesen werden, es wird immer der erste Eintrag herangezogen und für jedes Tupel eingegeben...

Vermutlich (sicher) ist die if - else Abfrage falsch, aber ich weiß es nicht besser. Wer kann mir helfen?

Danke
BlackJack

@Michi_J: Du hast da bloss *eine* Liste `coords_polyline`, deren Inhalt Du immer wieder löschst und neu füllst. In dieser einen Liste ist am Ende natürlich nur die letzte Koordinatenliste enthalten. Und da Du immer wieder die *selbe* Liste an `Endliste` anhängst, hast Du in den Einträgen dort halt auch in jedem Tupel eben diese eine Liste.

In Python werden nie Objekte kopiert wenn Du das nicht explizit selbst machst. Du möchtest *neue* Listen erstellen und mit Koordinaten füllen und nicht eine Liste immer wieder verwenden.

Hier mal eine kleine Session um zu sehen was bei Dir passiert:

Code: Alles auswählen

In [715]: a = list()

In [716]: xs = list()

In [717]: a.append(42)

In [718]: a.append(23)

In [719]: xs.append(a)

In [720]: xs
Out[720]: [[42, 23]]

In [721]: del a[:]

In [722]: xs
Out[722]: [[]]

In [723]: a.append(1)

In [724]: a.append(2)

In [725]: xs
Out[725]: [[1, 2]]

In [726]: xs.append(a)

In [727]: xs
Out[727]: [[1, 2], [1, 2]]

In [728]: del a[:]

In [729]: xs
Out[729]: [[], []]

In [730]: xs[0] is xs[1]
Out[730]: True
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

hmmm... das klingt einleuchtend. Wie kann ich das ändern?
BlackJack

@Michi_J: Na das habe ich doch schon gesagt: Für jede neue Koordinatenliste auch wirklich eine neue Liste an `coords_polyline` binden.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

@OP:
Mir ist deine Problembeschreibung nach wie vor unklar, aber suchst du sowas ähnliches:

Code: Alles auswählen

# Vorsicht, große Dosis Python 2.6!
def get_points(cur):
    lines = collections.defaultdict(list)

    for row in cur:
        lines[row.FID, row.FID_DREIEC, row.ORIG_FID] \
          .append([row.POINT_X, row.POINT_Y, row.POINT_Z]) 
    
    return sorted((tuple(itertools.chain(k, *v)) for k,v in lines.iteritems()),
        key=operator.itemgetter(2))
hth, Jörg
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

@ Jörg, ja, so was ähnliches, wie du gepostet hast, habe ich gesucht! Danke für deine Hilfe!
Antworten