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

Python Syntax
sorted(iterable, *, key=None, reverse=False)
Parameter
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:

Python Beispiel
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}))
Output
[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:

Python Beispiel
words = ["banana", "fig", "apple", "kiwi"]
print(sorted(words, key=len))           # nach Länge
print(sorted(words, key=str.lower))     # case-insensitive
Output
['fig', 'kiwi', 'apple', 'banana']
['apple', 'banana', 'fig', 'kiwi']

Absteigend mit reverse

reverse=True dreht die Sortier-Richtung um — funktioniert mit oder ohne key:

Python Beispiel
print(sorted([3, 1, 4, 1, 5, 9, 2, 6], reverse=True))
print(sorted(["banana", "fig", "apple"], key=len, reverse=True))
Output
[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:

Python Beispiel
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)
Output
{'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":

Python Beispiel
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)
Output
('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:

Python Beispiel
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)
Output
{'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() vs list.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/attrgetter sind schneller und lesbarer als Lambda-Funktionen.
  • key lä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).
/ Weiter

Zurück zu Builtin Functions

Zur Übersicht