Listen sortieren
Python-Listen mit sorted() und sort() sortieren, den key-Parameter nutzen, absteigend sortieren und benutzerdefinierte Objekte mit klaren Beispielen.
Das Sortieren einer Liste gehört zu den häufigsten Operationen in Python. Python bietet dafür zwei eingebaute Werkzeuge: die Funktion sorted(), die eine neue sortierte Liste zurückgibt, ohne die ursprüngliche zu verändern, und die Methode list.sort(), die die Liste an Ort und Stelle umsortiert. Beide akzeptieren ein reverse-Flag für absteigende Reihenfolge sowie einen key-Parameter für benutzerdefinierte Sortierlogik.
Dieses Kapitel behandelt:
sorted()— beliebige Iterables in eine neue Liste sortierenlist.sort()— eine Liste direkt sortieren- Sortieren in aufsteigender und absteigender Reihenfolge
- Den
key-Parameter — nach Länge, Feld oder einem benutzerdefinierten Kriterium sortieren - Groß-/Kleinschreibung-unabhängiges Sortieren
- Sortieren von Listen mit Dictionaries und benutzerdefinierten Objekten
- Mehrschlüssel-Sortierung
operator.itemgetterals effiziente Alternative zu Lambda
Grundlagenwissen über Listen findest du in den Kapiteln Python Lists und List Methods.
Die Funktion sorted()
sorted() nimmt ein beliebiges Iterable (Liste, Tupel, string, …) und gibt eine neue sortierte Liste zurück. Das ursprüngliche Iterable bleibt unverändert.
Syntax:
sorted(iterable, *, key=None, reverse=False)iterable— die zu sortierende Sequenzkey— eine optionale einstellige Funktion, die vor dem Vergleich auf jedes Element angewendet wird (Standard: Elemente direkt vergleichen)reverse— aufTruesetzen, um in absteigender Reihenfolge zu sortieren (Standard:False)
Eine Liste von Strings sortieren
Eine Liste von Zahlen sortieren
Numerische Listen werden nach Größe sortiert, nicht nach ihrer string-Darstellung (daher wird 10 nicht vor 9 einsortiert).
nums = [3, 1, 4, 1, 5, 9, 2, 6]
print(sorted(nums))
# [1, 1, 2, 3, 4, 5, 6, 9]In absteigender Reihenfolge mit reverse=True sortieren
Übergib reverse=True, um die größten Werte zuerst zu erhalten.
nums = [3, 1, 4, 1, 5, 9, 2, 6]
print(sorted(nums, reverse=True))
# [9, 6, 5, 4, 3, 2, 1, 1]Die Methode list.sort()
list.sort() sortiert die Liste an Ort und Stelle und gibt immer None zurück. Verwende sie, wenn du die ursprüngliche Reihenfolge nicht mehr benötigst und den Speicheraufwand einer zweiten Liste vermeiden möchtest.
Syntax:
list.sort(*, key=None, reverse=False)Die Parameter sind identisch mit denen von sorted().
Eine Liste direkt sortieren
In absteigender Reihenfolge sortieren
sort() gibt None zurück — ein häufiger Fallstrick
Ein verbreiteter Fehler ist, das Ergebnis von sort() einer Variablen zuzuweisen:
fruits = ['banana', 'apple', 'cherry']
result = fruits.sort() # sort() modifies fruits, returns None
print(result) # None ← not the sorted list!
print(fruits) # ['apple', 'banana', 'cherry'] ← fruits was modifiedWenn du sowohl das sortierte Ergebnis als auch die ursprüngliche Reihenfolge benötigst, verwende stattdessen sorted().
sorted() vs. list.sort() — Wann welche Methode verwenden?
sorted() | list.sort() | |
|---|---|---|
| Gibt zurück | Eine neue sortierte Liste | None |
| Ursprüngliche Liste | Unverändert | Direkt verändert |
| Funktioniert mit | Jedem Iterable | Nur Listen |
| Speicher | Benötigt zusätzlichen Speicher | Keine zusätzliche Liste |
Verwende sorted(), wenn du die ursprüngliche Liste unverändert benötigst oder ein Tupel bzw. ein anderes Iterable sortierst.
Verwende list.sort(), wenn du eine Liste hast, sie direkt sortieren möchtest und Speichereffizienz wichtig ist.
Sortieren mit dem key-Parameter
Der key-Parameter akzeptiert einen einstelligen Callable. Python ruft ihn einmal für jedes Element auf und verwendet den zurückgegebenen Wert für Vergleiche. Das vermeidet Datenduplizierung und macht das Sortieren flexibel.
Nach string-Länge sortieren
words = ['banana', 'apple', 'cherry', 'kiwi']
print(sorted(words, key=len))
# ['kiwi', 'apple', 'banana', 'cherry']len wird direkt übergeben — kein Lambda nötig, wenn eine eingebaute Funktion mit einem Argument verwendet wird.
Eine Liste von Tupeln nach einem bestimmten Feld sortieren
Das Lambda lambda x: x[1] extrahiert das zweite Element (die Zahl) aus jedem Tupel, sodass Python Zahlen anstatt ganzer Tupel vergleicht.
Eine Liste von Dictionaries sortieren
students = [
{'name': 'Charlie', 'grade': 85},
{'name': 'Alice', 'grade': 92},
{'name': 'Bob', 'grade': 78},
]
by_grade = sorted(students, key=lambda s: s['grade'])
for s in by_grade:
print(s['name'], s['grade'])
# Bob 78
# Charlie 85
# Alice 92Um in absteigender Reihenfolge zu sortieren (höchste Note zuerst), füge reverse=True hinzu:
by_grade_desc = sorted(students, key=lambda s: s['grade'], reverse=True)
for s in by_grade_desc:
print(s['name'], s['grade'])
# Alice 92
# Charlie 85
# Bob 78Groß-/Kleinschreibung-unabhängiges Sortieren
Standardmäßig ist Pythons Sortierung schreibungsabhängig: Alle Großbuchstaben kommen vor Kleinbuchstaben, da sie niedrigere Unicode-Codepunkte besitzen. Verwende key=str.lower, um ohne Rücksicht auf die Groß-/Kleinschreibung zu sortieren.
words = ['Banana', 'apple', 'Cherry', 'date']
print(sorted(words)) # case-sensitive (uppercase first)
# ['Banana', 'Cherry', 'apple', 'date']
print(sorted(words, key=str.lower)) # case-insensitive
# ['apple', 'Banana', 'Cherry', 'date']operator.itemgetter und operator.attrgetter verwenden
Das Modul operator bietet schnellere Alternativen zu Lambda für häufige Key-Muster.
operator.itemgetter — für Sequenzen und Dicts
import operator
fruits = [('apple', 10), ('banana', 5), ('cherry', 20)]
print(sorted(fruits, key=operator.itemgetter(1)))
# [('banana', 5), ('apple', 10), ('cherry', 20)]operator.itemgetter(1) entspricht lambda x: x[1], ist jedoch in C implementiert und läuft bei großen Listen schneller.
operator.attrgetter — für Objekte
import operator
class Student:
def __init__(self, name, grade):
self.name = name
self.grade = grade
def __repr__(self):
return f'Student({self.name!r}, {self.grade})'
students = [Student('Charlie', 85), Student('Alice', 92), Student('Bob', 78)]
print(sorted(students, key=operator.attrgetter('grade')))
# [Student('Bob', 78), Student('Charlie', 85), Student('Alice', 92)]Mehrschlüssel-Sortierung
Gib ein Tupel aus der key-Funktion zurück, um nach mehreren Kriterien zu sortieren. Python vergleicht Tupel Element für Element, sodass bei Gleichheit des ersten Schlüssels auf den zweiten zurückgegriffen wird.
# Sort by grade ascending, then by name alphabetically when grades tie
data = [('Alice', 85), ('Bob', 92), ('Charlie', 85), ('Dave', 78)]
result = sorted(data, key=lambda x: (x[1], x[0]))
print(result)
# [('Dave', 78), ('Alice', 85), ('Charlie', 85), ('Bob', 92)]Alice und Charlie haben beide die Note 85, daher werden sie alphabetisch sortiert — Alice vor Charlie.
Sortierstabilität
Pythons Sortierung ist stabil: Elemente, die als gleich gelten, behalten ihre ursprüngliche relative Reihenfolge. Das bedeutet, du kannst eine Liste zunächst nach einem Schlüssel sortieren, das Ergebnis dann nach einem anderen Schlüssel sortieren, und die Reihenfolge des ersten Sortierschritts bleibt bei Gleichstand des zweiten Schlüssels erhalten.
# Sort by grade, then (stably) by name — same result as the tuple key above
data = [('Alice', 85), ('Bob', 92), ('Charlie', 85), ('Dave', 78)]
step1 = sorted(data, key=lambda x: x[0]) # sort by name first
step2 = sorted(step1, key=lambda x: x[1]) # then sort by grade
print(step2)
# [('Dave', 78), ('Alice', 85), ('Charlie', 85), ('Bob', 92)]Diese Technik — auch Schwartzian Transform genannt — ist manchmal besser lesbar als ein zusammengesetzter Schlüssel.
Fazit
Pythons sorted() und list.sort() ermöglichen schnelles, flexibles Sortieren von Listen mit minimalem Code. Verwende sorted(), wenn du eine neue Liste benötigst oder ein Nicht-Listen-Iterable sortierst; verwende list.sort(), wenn du eine Liste direkt verändern möchtest. Der key-Parameter deckt nahezu jedes Sortierkriterium ab — von der Sortierung nach Länge oder einem Dict-Feld bis hin zu schreibungsunabhängigen Vergleichen. Bei großen Datensätzen empfiehlt sich operator.itemgetter oder operator.attrgetter statt Lambda für bessere Performance.
Weiterführende Lektüre:
- Python Lists — Listen erstellen, indizieren und slicen
- List Methods — vollständige Referenz der Listen-Methoden
- List Comprehension — prägnante Listenerstellung
- Loop Lists — über Listen iterieren