Seite 1 von 1
mehrdimensionale Liste sortieren
Verfasst: Montag 10. September 2007, 13:25
von Stolzi
Wie ich eine mehrdimensionale Liste zB
[[Name,Wert],[Name,Wert]]
nach Name sortiere habe ich rausgefunden:
Code: Alles auswählen
def lcmp(idx):
def t(i, j):
if i[idx] < j[idx]:
return -1
elif i[idx] > j[idx]:
return 1
else:
return 0
return t
liste.sort(cmp=lcmp(0))
Aber was ich nicht rausgefunden habe: Wie sortiere ich erst nach Name und dann nach Wert?
Kann mir da wer helfen?
Danke
Stolzi
Verfasst: Montag 10. September 2007, 13:49
von Mawilo
Ich mach das immer so:
Code: Alles auswählen
def lcmp(x):
return x[0], x[1]
liste = [['Name3','Wert3'],['Name2','Wert2'],['Name3','Wert1'],['Name3','Wert2']]
liste.sort(key=lcmp)
print liste
Mawilo
Verfasst: Montag 10. September 2007, 14:10
von mawe
Anscheinend bin ich nicht nüchtern genug, aber
Stolzi hat geschrieben:Wie sortiere ich erst nach Name und dann nach Wert?
Passiert das bei
liste.sort() nicht automatisch?
Mawilo hat geschrieben:Ich mach das immer so:
Wo ist der Unterschied zum einfachen
liste.sort()?
PS: Sortieren nach z.B. dem jeweils 2. Element macht man gerne so:
Code: Alles auswählen
import operator
lst = ...
lst.sort(key=operator.itemgetter(1))
Verfasst: Montag 10. September 2007, 14:19
von Mawilo
Mit
kann ich zuerst nach dem zweiten Element sortieren. Finde ich flexibler und muss nichts extra importieren.
Verfasst: Montag 10. September 2007, 14:30
von Stolzi
Danke Mawilo.
@mawe: automatisch? sort() wüsste doch garnicht nach welchem Element der Unterliste sortiert werden soll, oder? Hast du schon gesehen, dass ich eine _mehrdimensionale_ Liste meinte und keine normale?
Verfasst: Montag 10. September 2007, 14:47
von BlackJack
Es wird, genau wie bei Tupeln, erst nach dem ersten Element verglichen, wenn das gleich ist nach dem zweiten, usw.
Dieses "Wissen" steckt nicht in der `sort()`-Methode sondern in der `__cmp__()`-Methode von Listen und Tupeln.
Verfasst: Montag 10. September 2007, 14:48
von mawe
@Stolzi:
Code: Alles auswählen
In [1]: lst = [["b",2], ["a", 3], ["b", 1], ["a", 2]]
In [2]: lst.sort()
In [3]: lst
Out[3]: [['a', 2], ['a', 3], ['b', 1], ['b', 2]]
lst ist eine mehrdimensionale List (oder?), und das Ergebnis ... ist das nicht so sortiert wie du wolltest?
Verfasst: Montag 10. September 2007, 14:56
von Stolzi
Dass sort das kann wusste ich nicht
Aber ich kann nicht in erster Instanz nach [1] und in zweiter nach [0] sortieren denke ich? Dafür brauche ich eben die Funktion, oder?
Verfasst: Montag 10. September 2007, 15:24
von BlackJack
Ja da braucht man dann eine Funktion. Allerdings sollte man `key` benutzen und nicht `cmp`. Zum Beispiel:
Code: Alles auswählen
In [233]: lst = [["b",2], ["a", 3], ["b", 1], ["a", 2]]
In [234]: lst.sort(key=operator.itemgetter(1, 0))
In [235]: lst
Out[235]: [['b', 1], ['a', 2], ['b', 2], ['a', 3]]
Verfasst: Montag 10. September 2007, 19:19
von HWK
Code: Alles auswählen
>>> lst = [["b",2], ["a", 3], ["b", 1], ["a", 2]]
>>> lst.sort(key=operator.itemgetter(1, 0))
Traceback (most recent call last):
File "<pyshell#2>", line 1, in -toplevel-
lst.sort(key=operator.itemgetter(1, 0))
TypeError: itemgetter expected 1 arguments, got 2
Ist das neu in Python 2.5?
MfG
HWK
Verfasst: Montag 10. September 2007, 20:59
von BlackJack
Ups, ja. Hätte ich vielleicht erwähnen sollen.