mehrdimensionale Liste sortieren

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.
Antworten
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

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
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

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])

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))
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Mit

Code: Alles auswählen

return x[1], x[0]

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

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

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])

@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

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

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]]
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
BlackJack

Ups, ja. Hätte ich vielleicht erwähnen sollen.
Antworten