Listen sortieren mit list.sort(func())

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
Bernd

Donnerstag 30. Oktober 2003, 10:14

Ich bin's mal wieder,

ich versuche aus einer Liste von Punkten im Raum doppelte zu löschen.
Hierzu wollte ich der sort() Funktion einen Vergelichsfunktion für die Koordinaten übergeben, leider liefert sie nicht das korrekte Ergebnis.
Die Knoten sollten erst nach der x-, dann nach y- und der z-Koordinate sortiert sein, es tauchen aber Knotenfolgen auf die zwar in sich richtig sortiert sind, stehen aber nicht an der richtigen Stelle in der Liste. Liegt das an dem internen Algorithmus, der die Liste in Abschnitte zerlegt und hinterher wieder zusammensetzt? Eigentlich wollte ich diese schnellen Verfahren gerade ausnutzten, da das eigene von mir verwendete sehr langsam ist (vgl. Forumeintrag :Sortieralgorithmus - zwei Schleifenmethode)
Ich füge hier mal meine Vergleichsfunktion ein - sollte es an ihr liegen?

Code: Alles auswählen

    def byCoordinates(N1,N2):
        if N1.x<N2.x :return 1
        elif N1.x==N2.x and N1.y<N2.y :return 1
        elif N1.x==N2.x and N1.y==N2.y and N1.z<N2.z:    return 1
        if N1.x==N2.x and N1.y==N2.y and N1.z==N2.z:    return 0
        return -1
bis bald
Bernd
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Donnerstag 30. Oktober 2003, 10:50

Hallo!
Bernd hat geschrieben: Ich füge hier mal meine Vergleichsfunktion ein - sollte es an ihr liegen?

Code: Alles auswählen

x y z
unsortiert
2 2 1
3 2 2
1 3 2
1 1 2
1 1 1
1 2 1
2 1 1
1 1 1
sortiert mit sort(byCoordinates)
3 2 2
2 2 1
2 1 1
1 3 2
1 2 1
1 1 2
1 1 1
1 1 1
Sieht ok aus. Vielleicht kannst Du mal ein paar Koordinaten angeben, bei denen Du nicht das gewünschte Ergebnis bekommst.

BTW: Der Einsatz des sonst üblichen Dictionaries für's Löschen von doppelten Einträgen scheidet aus?

Jan

Nachtrag: Beispiel für's Löschen via Dict

Code: Alles auswählen

d = {}
for k in koords:
    d[k.x,k.y,k.z] = k
koords = d.values()
Gast

Donnerstag 30. Oktober 2003, 12:04

Hallo Jan,

hier mal eine Ausgabe von mir -

Code: Alles auswählen

     1, -2.167963e-002, 0.000000e+000, -1.141796e-001
     2, -2.046107e-002, 0.000000e+000, -1.141796e-001
     3, -1.924251e-002, 0.000000e+000, -1.141796e-001
     4, -1.802394e-002, 0.000000e+000, -1.141796e-001
     5, -1.680538e-002, 0.000000e+000, -1.141796e-001
     5, -1.680538e-002, 0.000000e+000, -1.141796e-001
     6, -2.167963e-002, 3.250000e-003, -1.141796e-001
...

  125, -1.680538e-002, 1.300000e-002, -1.093054e-001
  127, -1.215269e-002, 0.000000e+000, -1.141796e-001
erst habe ich gedacht er sortiert nicht nach xyz, sonder zyx, aber später (...) folgte dann dieser "Fehler". Ich habe die List mit
sort(byNodeNumbers)) umgestellt, um die doppelten besser zu sehen, so ergab sich dann der "Fehler" - und somit die Anwort auf meine Frage :wink:

Aber es bestätig sich mal wieder - wenn man (hier: ich) über Probleme spricht, fallen einem auch die Lösungen ein!

In diesem Sinne (die Kontrollausgaben immer schön an die richtige Stelle im Quelltext setzen!)
Bernd
Antworten