PYTHON: Listen innerhalb einer Liste nach einem bestimmten Feld sortieren

KRiusd

Jungspund
Beiträge
23
Hallo zusammen,

folgendes Problem:

Ich habe eine Liste in der viele Listen vorhanden sind:

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

Wenn ich die Liste nach dem ersten Element sortieren will ist das ja einfach:
Code:
a.sort()

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


Schon mal danke

KRiusd
 

thorus

GNU-Freiheitskämpfer
Beiträge
757
sort() kann man eine Vergleichsfunktion übergeben. In deinem Fall, könnte man so schreiben:
Code:
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
 
Zuletzt bearbeitet:

KRiusd

Jungspund
Beiträge
23
Vielen Dank!

Das hilft mir schon mal ein wenig!

Allerdings meldet sich Python mit:
Code:
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
 
Zuletzt bearbeitet:

thorus

GNU-Freiheitskämpfer
Beiträge
757
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:
Code:
>>> print [].sort.__doc__
L.sort(cmpfunc=None) -- stable sort *IN PLACE*; cmpfunc(x, y) -> -1, 0, 1
Während in 2.4:
Code:
>>> 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:
Code:
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
 
Zuletzt bearbeitet:
O

Onkel_Tom

Gast
eine erweiterte Frage

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

Code:
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:
Code:
print b
>>>>
a var1 typ2 2
b var2 typ1 3
a var1 typ2 1
b var2 typ2 1

soll werden zu:
Code:
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
 

Ähnliche Themen

Keine grafische Oberfläche (Debian Installation)

[gelöst] - for file in ... nur für bestimmte Endungen?

Wired-Lan komisches Verhalten

HandbrakeCLI Shell Skript

Router einbinden bei Webauth?

Oben