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.
Stolzi
User
Beiträge: 155 Registriert: Mittwoch 18. August 2004, 15:44
Montag 10. September 2007, 13:25
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
Mawilo
User
Beiträge: 454 Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:
Montag 10. September 2007, 13:49
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
mawe
Python-Forum Veteran
Beiträge: 1209 Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])
Montag 10. September 2007, 14:10
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))
Mawilo
User
Beiträge: 454 Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:
Montag 10. September 2007, 14:19
Mit
kann ich zuerst nach dem zweiten Element sortieren. Finde ich flexibler und muss nichts extra importieren.
Stolzi
User
Beiträge: 155 Registriert: Mittwoch 18. August 2004, 15:44
Montag 10. September 2007, 14:30
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?
BlackJack
Montag 10. September 2007, 14:47
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.
mawe
Python-Forum Veteran
Beiträge: 1209 Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])
Montag 10. September 2007, 14:48
@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?
Stolzi
User
Beiträge: 155 Registriert: Mittwoch 18. August 2004, 15:44
Montag 10. September 2007, 14:56
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?
BlackJack
Montag 10. September 2007, 15:24
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]]
HWK
User
Beiträge: 1295 Registriert: Mittwoch 7. Juni 2006, 20:44
Montag 10. September 2007, 19:19
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