Sortieren von Liste mit Tubel

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
zweitklassigerCoder
User
Beiträge: 6
Registriert: Dienstag 14. Dezember 2021, 16:32

Hey, komme leider nicht weiter.
Stehe vor folgendem Problem:
Mir liegt eine Liste vor die ich aus einem dict generiert habe. Die Liste sieht in etwa so aus:

[('apple', 4), ('wings', 2), ('ham', 1), ('eggs', 2), ('spam', 1), ('milk', 99)]

Nun will ich die Liste in absteigender Reihenfolge der Werte, also:

[('milk',99),('apple',4),('wings', 2),('eggs', 2),('spam',1)

Wie kann ich die Tubels einzeln betrachten bzw. die Werte der Tubels miteinander vergleichen?
Ich möchte hierzu die sort() oder die sorted() Funktion verwenden. Kann mir jmd. helfen? Vielen Dank!
Lg zweitklassigerCoder
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@zweitklassigerCoder:

Zuerst: es heißt Tupel, nicht Tubel.

Gegeben ein Tupel:

Code: Alles auswählen

('spam', 123)
dann kann man über einen Index auf die einzelnen Elemente zugreifen:

Code: Alles auswählen

>>> tup = ('spam', 123)
>>> tup[0]
'spam'
>>> tup[1]
123
Will man diese Liste von Tupeln sortieren:

Code: Alles auswählen

>>> tups = [('apple', 4), ('wings', 2), ('ham', 1), ('eggs', 2), ('spam', 1), ('milk', 99)]
dann kann man der sorted()-Funktion ein zweites Argument mitgeben, key, mit der man das Element auswählt, nach dem sortiert werden soll:

Code: Alles auswählen

>>> list(sorted(tups, key=lambda tup: tup[1]))
[('ham', 1), ('spam', 1), ('wings', 2), ('eggs', 2), ('apple', 4), ('milk', 99)]
Man kann auch operator.itemgetter importieren, dann braucht man keine lambda-Funktion schreiben:

Code: Alles auswählen

>>> from operator import itemgetter
>>> list(sorted(tups, key=itemgetter(1, 0)))
[('ham', 1), ('spam', 1), ('eggs', 2), ('wings', 2), ('apple', 4), ('milk', 99)]
Wie man sieht, kann man auch nach mehr als einem Element sortieren, damit bei gleichem zweiten Element zusätzlich auch nach dem ersten sortiert wird, also dass zB. ('eggs', 2) vor ('wings', 2) kommt.
In specifications, Murphy's Law supersedes Ohm's.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Bei sorted bist du schon richtig, du must nur in die Dokumentation schauen:
https://docs.python.org/3/howto/sorting ... -functions
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

@pillmuncher: `sorted` liefert immer eine Liste, der `list`-Aufruf ist daher unnötig.

@zweitklassigerCoder: wenn Du sorted benutzt, mußt Du nicht erst eine Liste erzeugen

Code: Alles auswählen

from operators import itemgetter

data = {'apple': 4, 'wings': 2, 'ham': 1, 'eggs': 2, 'spam': 1, 'milk': 99}
result = sorted(data.items(), key=itemgetter(1, 0))                                                                                                                                                                      
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Sirius3: Ach ja. Seit Python3 mach ich automatisch um alles sequenz-/iteratorartige einen list()-Aufruf. Ist natürlich nicht immer sinnvoll.
In specifications, Murphy's Law supersedes Ohm's.
Antworten