Die Python-Funktion sorted(iterable, key=None, reverse=False) liefert eine neue, sortierte Liste aus den Elementen eines Iterables. Im Gegensatz zu list.sort() arbeitet sie nicht in-place — die ursprüngliche Sequenz bleibt unverändert. Über key lässt sich die Sortierreihenfolge anpassen, über reverse die Richtung. Pythons Sort ist stabil — Elemente mit gleichem Schlüssel behalten ihre ursprüngliche Reihenfolge.
Einleitung
sorted() und list.sort() decken die zwei wichtigsten Sortier-Bedürfnisse in Python ab:
sorted(seq)liefert eine neue Liste, lässt das Original unangetastet — funktioniert mit jedem Iterable.list.sort()sortiert in-place, ohne Kopie — nur für Listen.
Pythons Sortier-Algorithmus ist Timsort — eine angepasste Mergesort-Variante mit O(n log n) Worst-Case und O(n) Best-Case bei bereits sortierten Daten. Er ist stabil: bei mehreren Elementen mit gleichem Sort-Key bleibt die Originalreihenfolge erhalten.
Die key-Funktion ist der wichtigste Anpassungspunkt. Sie wird auf jedes Element einmal angewendet — das Ergebnis bestimmt die Sortierung, das Original-Element wird zurückgegeben.
Syntax
sorted(iterable, *, key=None, reverse=False)iterable Beliebige Iterable — Liste, Tupel, Set, Generator, dict (sortiert die Keys).
key (Optional, Keyword) Einstellige Funktion zur Bestimmung des Sortier-Schlüssels.
reverse (Optional, Keyword) True → absteigend, Default False → aufsteigend.
Rückgabewert
Eine neue list mit den Elementen in sortierter Reihenfolge.
Beispiele
Standard-Sortierung
sorted() liefert immer eine neue Liste — egal welcher Iterable-Typ als Eingabe kommt:
print(sorted([3, 1, 4, 1, 5, 9, 2, 6]))
print(sorted("hallo"))
print(sorted({"banana", "apple", "cherry"}))
print(sorted({"b": 2, "a": 1, "c": 3}))[1, 1, 2, 3, 4, 5, 6, 9]
['a', 'h', 'l', 'l', 'o']
['apple', 'banana', 'cherry']
['a', 'b', 'c']Mit key-Funktion
Die key-Funktion macht aus den Elementen den Sortier-Wert — das Original landet in der Liste:
words = ["banana", "fig", "apple", "kiwi"]
print(sorted(words, key=len)) # nach Länge
print(sorted(words, key=str.lower)) # case-insensitive['fig', 'kiwi', 'apple', 'banana']
['apple', 'banana', 'fig', 'kiwi']Absteigend mit reverse
reverse=True dreht die Sortier-Richtung um — funktioniert mit oder ohne key:
print(sorted([3, 1, 4, 1, 5, 9, 2, 6], reverse=True))
print(sorted(["banana", "fig", "apple"], key=len, reverse=True))[9, 6, 5, 4, 3, 2, 1, 1]
['banana', 'apple', 'fig']Praktische Beispiele
Liste von Dicts nach Feld sortieren
itemgetter aus operator ist meist schneller und lesbarer als ein Lambda für Dict-Zugriffe:
from operator import itemgetter
users = [
{"name": "Cleo", "age": 31},
{"name": "Alice", "age": 17},
{"name": "Bob", "age": 24},
]
for u in sorted(users, key=itemgetter("age")):
print(u){'name': 'Alice', 'age': 17}
{'name': 'Bob', 'age': 24}
{'name': 'Cleo', 'age': 31}Mehrstufige Sortierung mit Tupel-Key
Tupel-Keys sortieren komponentenweise — perfekt für "primär nach X, sekundär nach Y":
people = [
("Müller", "Anna", 1990),
("Müller", "Karl", 1985),
("Schmidt", "Anna", 1992),
("Schmidt", "Karl", 1980),
]
# Primär: Nachname, sekundär: Vorname, tertiär: Jahr
for p in sorted(people, key=lambda t: (t[0], t[1], t[2])):
print(p)('Müller', 'Anna', 1990)
('Müller', 'Karl', 1985)
('Schmidt', 'Anna', 1992)
('Schmidt', 'Karl', 1980)Stabilität nutzen für komplexe Sortierungen
Pythons stabile Sortierung erlaubt mehrstufige Sortierung durch wiederholtes sorted() — von der schwächsten zur stärksten Sortier-Bedingung:
items = [
{"name": "A", "prio": 2, "created": 3},
{"name": "B", "prio": 1, "created": 1},
{"name": "C", "prio": 2, "created": 1},
{"name": "D", "prio": 1, "created": 2},
]
# 1. nach created
items = sorted(items, key=lambda x: x["created"])
# 2. dann nach prio (stabil → created bleibt sekundär)
items = sorted(items, key=lambda x: x["prio"])
for i in items:
print(i){'name': 'B', 'prio': 1, 'created': 1}
{'name': 'D', 'prio': 1, 'created': 2}
{'name': 'C', 'prio': 2, 'created': 1}
{'name': 'A', 'prio': 2, 'created': 3}Praktische Hinweise
sorted()vslist.sort(): Ersteres erzeugt Kopie, letzteres ist in-place.- Stabilität ausnutzen: Mehrstufige Sortierung von schwächster zu stärkster Bedingung — keine Tupel-Keys nötig.
operator.itemgetter/attrgettersind schneller und lesbarer als Lambda-Funktionen.keyläuft genau einmal pro Element — teure Schlüsselberechnung kein Problem.- Verwandte Werkzeuge:
min()/max()(extreme Werte),heapq.nsmallest/nlargest(Top/Bottom-N),bisect(sortiertes Einfügen).