Seite 1 von 1

sort, Python 2.3.5 und key Problem

Verfasst: Sonntag 24. Juni 2007, 22:39
von _johannes
Hallo,

Ich habe folgendes Problem:
Ich habe mit ziemlichen Aufwand ein Python-Skript geschrieben, hier bei mir auf dem Mac (Python 2.5).
Das fertige Skript soll nun aber auf einem alten Linux-Rechner laufen, auf dem nur Python 2.3.5 läuft.
Dummerweise habe ich als relativer Python- und Programmier-Neuling nicht auf Abwärtskompatibilität geachtet :-(.
In meinem Skript kommt eine Funktion vor, die einen key-Parameter definiert, mit dem ich anschließend sortiere. Das geht, wie ich gerade ergoogelt habe, aber erst ab Python 2.4.
Nun,...
die Fehlermeldung des Linux-Rechners ist mir nun klar, aber noch nicht, wie ich die entsprechende Funktion umschreiben muss, damit dass ganze auch unter 2.3.5 läuft.

Um diesen Abschnitt handelt es sich (Sinn:verschachtelte Liste (list) intern sortieren nach dem jeweils 4.Element der in der umgebenden Liste aufgeführten Unterlisten(t)):

Code: Alles auswählen

def viertes(t):
 return [t[4]]
 
liste.sort(key=viertes)
Danke für Eure Hilfe.
_johannes

Verfasst: Sonntag 24. Juni 2007, 23:22
von mitsuhiko

Code: Alles auswählen

foo.sort(key=func)
kannst du auch schreiben als

Code: Alles auswählen

foo.sort(lambda a, b: cmp(func(a), func(b)))

Verfasst: Montag 25. Juni 2007, 00:45
von _johannes
Danke für die schnelle Antwort,

aber leider kapiere ich's noch nicht. Kannst Du mir auf die Sprünge helfen?
cmp vergleicht doch hier zwei Funktionen, aber ich habe doch nur eine?!?
Ich kann auch vorher nicht festlegen wieviele Unterlisten in der übergeordneten Liste stehen. Ist das evtl. ein Problem?

Gruss,
_johannes

Verfasst: Montag 25. Juni 2007, 01:12
von nkoehring
nein nein... du hast nicht zwei funktionen, sondern zweimal die gleich funktion mit unterschiedlichen argumenten... du gehst sozusagen die liste zur sortierung nacheinander durch...

Verfasst: Montag 25. Juni 2007, 07:16
von birkenfeld
blackbird hat geschrieben:

Code: Alles auswählen

foo.sort(key=func)
kannst du auch schreiben als

Code: Alles auswählen

foo.sort(lambda a, b: cmp(func(a), func(b)))
Was allerdings nicht dasselbe ist, weil es in ungünstigen Fällen mehr Aufrufe von func() benötigt. Besser ist dann

Code: Alles auswählen

foo = [(func(x), x) for x in foo]
foo.sort()
foo = [x[1] for x in foo]
-- auch bekannt als "decorate-sort-undecorate"-Pattern.

Verfasst: Montag 25. Juni 2007, 08:45
von Rebecca
[wiki]Sortierungs-Tutorium[/wiki] :)