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

mehrdimensionale Liste sortieren

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

Beitragvon Mawilo » 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])

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

Beitragvon Mawilo » Montag 10. September 2007, 14:19

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

Beitragvon Stolzi » 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

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

Beitragvon mawe » 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

Beitragvon Stolzi » 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

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

Beitragvon HWK » 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
BlackJack

Beitragvon BlackJack » Montag 10. September 2007, 20:59

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

Wer ist online?

Mitglieder in diesem Forum: /me, __deets__, Bing [Bot]