PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PYTHON: Listen innerhalb einer Liste nach einem bestimmten Feld sortieren



KRiusd
23.12.2005, 13:00
Hallo zusammen,

folgendes Problem:

Ich habe eine Liste in der viele Listen vorhanden sind:


a = [ ['Name', 'Vorname', 'Alter'], ['Name', 'Vorname', 'Alter'], ... ]

Wenn ich die Liste nach dem ersten Element sortieren will ist das ja einfach:

a.sort()

Wie stelle ich es jetzt an das ich nach Vorname oder Alter sortieren kann!


Schon mal danke

KRiusd

thorus
30.12.2005, 13:31
sort() kann man eine Vergleichsfunktion übergeben. In deinem Fall, könnte man so schreiben:


lcmp = lambda idx: lambda i, j: (i[idx] < j[idx]) and -1 or \
(i[idx] > j[idx]) and 1 or 0

a.sort(cmp=lcmp(1)) # Vorname
a.sort(cmp=lcmp(2)) # Alter

KRiusd
09.01.2006, 08:58
Vielen Dank!

Das hilft mir schon mal ein wenig!

Allerdings meldet sich Python mit:

TypeError: sort() takes no keyword arguments

Habe gerade festgestellt, das Python 2.3.4 (mit dem ich arbeite) noch nicht mit cmp, key und reverse umgehen kann!

Gibt es noch eine andere Möglichkeit sort() den lcmp Befehl schmackhaft zu machen?

Thx

thorus
09.01.2006, 17:40
Ok, da ein Upgrade wohl bei dir nicht hilft (btw. ich liebe Decorators in 2.4, mein Weihnachtsbaum ist voller @s vor lauterm decorieren. :D), müssen wir mal in Python 2.3 gucken:

>>> print [].sort.__doc__
L.sort(cmpfunc=None) -- stable sort *IN PLACE*; cmpfunc(x, y) -> -1, 0, 1
Während in 2.4:

>>> print [].sort.__doc__
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
cmp(x, y) -> -1, 0, 1
Also einfach statt cmp cmpfunc angeben, oder einfach gar kein Keyword angeben weils ja sowieso das erste Argument jeweils ist.
Sorry, war mein Fehler, das wusste ich nicht, dass es in 2.3 anders heißt.

EDIT:
Merke grade, dass die Funktion lcmp vielleicht etwas unübersichtlich ausschaut, man könnte sie natürlich auch so schreiben:

def lcmp(idx):
def t(i, j):
if i[idx] < j[idx]: # kleiner
return -1
elif i[idx] > j[idx]: # größer
return 1
else: # gleich
return 0

return t

KRiusd
10.01.2006, 08:41
Jetzt hats geklappt! :)

Funktioniert einwandfrei!

Viel Dank!

Onkel_Tom
12.07.2006, 11:48
Hallo,
ich habe ein Problem, das in die gleiche Richtung geht, aber noch nen Schritt komplexer ist.

Ich habe auch eine Liste, in der wiederum Listen stehen


b = [ ['Art', 'Variante', 'Typ', float(Dauer)], ['Art', 'Variante', 'Typ', float(Dauer)], ...]

Ich will nun diese Liste so sortieren, dass alle Einträge, bei denen Art und Variante und Typ gleich sind untereinander stehen und nach Dauer aufsteigend sortiert sind.

Also in etwa so:

print b
>>>>
a var1 typ2 2
b var2 typ1 3
a var1 typ2 1
b var2 typ2 1


soll werden zu:

print b.sort()
>>>>
a var1 typ2 1
a var1 typ2 2
b var2 typ1 3
b var2 typ2 1


Vielen Dank für Hilfe.
Onkel_Tom