W3docs

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 sortieren
  • list.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.itemgetter als 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 Sequenz
  • key — eine optionale einstellige Funktion, die vor dem Vergleich auf jedes Element angewendet wird (Standard: Elemente direkt vergleichen)
  • reverse — auf True setzen, um in absteigender Reihenfolge zu sortieren (Standard: False)

Eine Liste von Strings sortieren

python— editable, runs on the server

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

python— editable, runs on the server

In absteigender Reihenfolge sortieren

python— editable, runs on the server

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 modified

Wenn 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ückEine neue sortierte ListeNone
Ursprüngliche ListeUnverändertDirekt verändert
Funktioniert mitJedem IterableNur Listen
SpeicherBenötigt zusätzlichen SpeicherKeine 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

python— editable, runs on the server

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 92

Um 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 78

Groß-/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:

Übung

Übung
Which of the following statements about sorted() and list.sort() are true?
Which of the following statements about sorted() and list.sort() are true?
Was this page helpful?