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

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.

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.