Skip to content

Python Sortieren: Vollständiger Leitfaden zu sorted(), list.sort() und benutzerdefiniertem Sortieren

Updated on

Das Sortieren von Daten ist eine der grundlegendsten Operationen in der Programmierung – dennoch verwirrt viele Entwickler die Entscheidung zwischen Pythons sorted()-Funktion und der list.sort()-Methode. Egal, ob du Schülerergebnisse rankst, Produktpreise organisierst oder Dateilisten verarbeitest: Wenn du Pythons Sortiermechanismen verstehst, sparst du Zeit und vermeidest Bugs. Dieser Leitfaden beleuchtet jeden Aspekt des Sortierens in Python – von einfachen Zahlenlisten bis hin zu komplexen benutzerdefinierten Vergleichen – mit praxisnahen Beispielen, die du sofort einsetzen kannst.

📚

sorted() vs list.sort(): Der entscheidende Unterschied

Python bietet zwei primäre Sortiermechanismen, die ähnlich wirken, sich aber grundlegend unterschiedlich verhalten. Die sorted()-Funktion erstellt eine neue sortierte Liste und lässt das Original unverändert. Die list.sort()-Methode verändert die Liste direkt (in place) und gibt None zurück.

# sorted() returns a new list
numbers = [3, 1, 4, 1, 5]
sorted_nums = sorted(numbers)
print(sorted_nums)  # [1, 1, 3, 4, 5]
print(numbers)      # [3, 1, 4, 1, 5] - original unchanged
 
# list.sort() modifies in place
numbers = [3, 1, 4, 1, 5]
result = numbers.sort()
print(numbers)      # [1, 1, 3, 4, 5] - original modified
print(result)       # None

Dieser Unterschied ist wichtig für Speichereffizienz und das Bewahren von Daten. Nutze sorted(), wenn du die Original-Liste behalten musst oder wenn du unveränderliche Sequenzen wie Tuples sortierst. Nutze list.sort(), wenn du mit großen Listen arbeitest, bei denen eine Kopie zu viel Speicher verbrauchen würde.

# sorted() works with any iterable
tuple_data = (42, 17, 93, 8)
sorted_list = sorted(tuple_data)  # Returns [8, 17, 42, 93]
 
# list.sort() only works on lists
# tuple_data.sort()  # AttributeError: 'tuple' object has no attribute 'sort'

Grundlegendes Sortieren: Zahlen, Strings und gemischte Typen

Pythons Standard-Sortierverhalten nutzt die natürliche Ordnung. Zahlen werden numerisch sortiert, Strings alphabetisch, und Listen mit gemischten Typen erfordern eine explizite Behandlung.

# Numeric sorting
integers = [42, -7, 0, 93, 15]
print(sorted(integers))  # [-7, 0, 15, 42, 93]
 
floats = [3.14, 2.71, 1.41, 9.81]
print(sorted(floats))    # [1.41, 2.71, 3.14, 9.81]
 
# String sorting (lexicographic order)
words = ['zebra', 'apple', 'mango', 'banana']
print(sorted(words))     # ['apple', 'banana', 'mango', 'zebra']
 
# Mixed types cause errors in Python 3
mixed = [3, 'apple', 1.5]
# sorted(mixed)  # TypeError: '<' not supported between instances

Für numerische Strings, die numerisch statt alphabetisch sortiert werden sollen, konvertiere sie beim Sortieren:

# String numbers sort alphabetically
string_nums = ['10', '2', '100', '21']
print(sorted(string_nums))  # ['10', '100', '2', '21']
 
# Convert to int for numeric sorting
print(sorted(string_nums, key=int))  # ['2', '10', '21', '100']

Umgekehrtes Sortieren mit reverse=True

Sowohl sorted() als auch list.sort() akzeptieren einen reverse-Parameter, der die Sortierreihenfolge umkehrt. Standardmäßig ist dieser Parameter False (aufsteigende Sortierung).

scores = [88, 92, 75, 95, 82]
 
# Descending order using reverse=True
print(sorted(scores, reverse=True))  # [95, 92, 88, 82, 75]
 
# In-place descending sort
scores.sort(reverse=True)
print(scores)  # [95, 92, 88, 82, 75]
 
# Reverse alphabetical order
names = ['Alice', 'David', 'Bob', 'Charlie']
print(sorted(names, reverse=True))  # ['David', 'Charlie', 'Bob', 'Alice']

Der key-Parameter: Benutzerdefinierte Sortierlogik

Der key-Parameter nimmt eine Funktion entgegen, die jedes Element vor dem Vergleich transformiert. Damit kannst du nach bestimmten Attributen, berechneten Werten oder komplexen Kriterien sortieren, ohne die Originaldaten zu verändern.

# Sort by string length
words = ['python', 'is', 'awesome', 'for', 'data']
print(sorted(words, key=len))  # ['is', 'for', 'data', 'python', 'awesome']
 
# Sort by absolute value
numbers = [-5, -2, 3, -8, 1]
print(sorted(numbers, key=abs))  # [1, -2, 3, -5, -8]
 
# Sort case-insensitive
names = ['alice', 'Bob', 'CHARLIE', 'david']
print(sorted(names, key=str.lower))  # ['alice', 'Bob', 'CHARLIE', 'david']

Lambda-Funktionen für Inline-Sortierung

Lambda-Funktionen bieten eine kompakte Syntax für einfache key-Funktionen. Sie sind ideal für einmalige Transformationen, bei denen das Definieren einer separaten Funktion zu ausführlich wäre.

# Sort tuples by second element
pairs = [(1, 'b'), (3, 'a'), (2, 'd'), (4, 'c')]
print(sorted(pairs, key=lambda x: x[1]))
# [(3, 'a'), (1, 'b'), (4, 'c'), (2, 'd')]
 
# Sort strings by last character
words = ['python', 'java', 'ruby', 'go']
print(sorted(words, key=lambda s: s[-1]))
# ['java', 'go', 'ruby', 'python']
 
# Sort by distance from target value
target = 50
values = [45, 62, 38, 55, 48]
print(sorted(values, key=lambda x: abs(x - target)))
# [48, 45, 55, 38, 62]

Sortieren nach mehreren Kriterien

Wenn Sortieren mehrere Prioritäten erfordert, gib ein Tuple aus der key-Funktion zurück. Python vergleicht Tuples Element für Element und ermöglicht so natürliches mehrstufiges Sortieren.

# Sort students by grade (descending), then name (ascending)
students = [
    ('Alice', 85),
    ('Bob', 92),
    ('Charlie', 85),
    ('David', 92)
]
 
sorted_students = sorted(students, key=lambda x: (-x[1], x[0]))
print(sorted_students)
# [('Bob', 92), ('David', 92), ('Alice', 85), ('Charlie', 85)]
 
# Sort dates by year (descending), then month (ascending)
dates = ['2024-03', '2023-12', '2024-01', '2023-08']
print(sorted(dates, key=lambda d: (-int(d[:4]), int(d[5:]))))
# ['2024-01', '2024-03', '2023-08', '2023-12']

operator.itemgetter und operator.attrgetter

Das operator-Modul bietet optimierte Alternativen zu Lambda-Funktionen für gängige Sortiermuster. Diese Funktionen laufen schneller als Lambdas und verbessern die Lesbarkeit des Codes.

from operator import itemgetter, attrgetter
 
# Sort by specific dictionary keys
data = [
    {'name': 'Alice', 'age': 30, 'score': 85},
    {'name': 'Bob', 'age': 25, 'score': 92},
    {'name': 'Charlie', 'age': 30, 'score': 78}
]
 
# Sort by age, then score
sorted_data = sorted(data, key=itemgetter('age', 'score'))
print([d['name'] for d in sorted_data])  # ['Bob', 'Charlie', 'Alice']
 
# Sort by tuple elements
records = [(1, 'b', 300), (2, 'a', 100), (1, 'a', 200)]
print(sorted(records, key=itemgetter(0, 1)))
# [(1, 'a', 200), (1, 'b', 300), (2, 'a', 100)]

Für Objektattribute nutze attrgetter:

from operator import attrgetter
 
class Employee:
    def __init__(self, name, salary, department):
        self.name = name
        self.salary = salary
        self.department = department
 
    def __repr__(self):
        return f'{self.name}({self.department}, ${self.salary})'
 
employees = [
    Employee('Alice', 75000, 'Engineering'),
    Employee('Bob', 65000, 'Marketing'),
    Employee('Charlie', 75000, 'Engineering')
]
 
# Sort by department, then salary (descending)
sorted_emps = sorted(employees, key=attrgetter('department'))
print(sorted_emps)

Dictionaries sortieren

Dictionaries selbst sind ungeordnet (auch wenn Python 3.7+ die Einfügereihenfolge beibehält), aber du kannst ihre Schlüssel, Werte oder Items sortieren.

# Sort dictionary by keys
data = {'zebra': 3, 'apple': 1, 'mango': 2}
sorted_keys = sorted(data.keys())
print(sorted_keys)  # ['apple', 'mango', 'zebra']
 
# Create new dict with sorted keys
sorted_dict = {k: data[k] for k in sorted_keys}
print(sorted_dict)  # {'apple': 1, 'mango': 2, 'zebra': 3}
 
# Sort by values
sorted_by_value = sorted(data.items(), key=lambda x: x[1])
print(sorted_by_value)  # [('apple', 1), ('mango', 2), ('zebra', 3)]
 
# Convert back to dictionary
sorted_dict = dict(sorted_by_value)

Für komplexe Werttypen:

# Sort dictionary by nested values
products = {
    'laptop': {'price': 999, 'stock': 5},
    'phone': {'price': 599, 'stock': 12},
    'tablet': {'price': 399, 'stock': 8}
}
 
# Sort by price
by_price = sorted(products.items(), key=lambda x: x[1]['price'])
print([(name, info['price']) for name, info in by_price])
# [('tablet', 399), ('phone', 599), ('laptop', 999)]
 
# Sort by stock (descending)
by_stock = sorted(products.items(), key=lambda x: -x[1]['stock'])
print([(name, info['stock']) for name, info in by_stock])
# [('phone', 12), ('tablet', 8), ('laptop', 5)]

Listen von Tuples sortieren

Tuples werden standardmäßig sortiert, indem Elemente von links nach rechts verglichen werden. Dieses Verhalten kannst du mit key-Funktionen anpassen.

# Default tuple sorting (compares element by element)
tuples = [(1, 'z'), (2, 'a'), (1, 'a'), (2, 'z')]
print(sorted(tuples))
# [(1, 'a'), (1, 'z'), (2, 'a'), (2, 'z')]
 
# Sort by second element only
print(sorted(tuples, key=lambda x: x[1]))
# [(2, 'a'), (1, 'a'), (1, 'z'), (2, 'z')]
 
# Sort by sum of numeric elements
coord_distances = [(1, 2), (3, 1), (2, 2), (1, 3)]
print(sorted(coord_distances, key=sum))
# [(1, 2), (2, 2), (1, 3), (3, 1)]

Listen von Dictionaries sortieren

Beim Sortieren von Dictionaries in Listen musst du angeben, welcher Key für den Vergleich genutzt wird.

people = [
    {'name': 'Alice', 'age': 30, 'city': 'New York'},
    {'name': 'Bob', 'age': 25, 'city': 'San Francisco'},
    {'name': 'Charlie', 'age': 30, 'city': 'Austin'}
]
 
# Sort by age
by_age = sorted(people, key=lambda x: x['age'])
print([p['name'] for p in by_age])  # ['Bob', 'Alice', 'Charlie']
 
# Sort by age (descending), then name (ascending)
by_age_name = sorted(people, key=lambda x: (-x['age'], x['name']))
print([f"{p['name']} ({p['age']})" for p in by_age_name])
# ['Alice (30)', 'Charlie (30)', 'Bob (25)']
 
# Using itemgetter (more efficient)
from operator import itemgetter
by_city = sorted(people, key=itemgetter('city'))
print([p['city'] for p in by_city])
# ['Austin', 'New York', 'San Francisco']

Listen von Objekten sortieren

Eigene Klassen benötigen key-Funktionen, die vergleichbare Attribute extrahieren.

class Product:
    def __init__(self, name, price, rating):
        self.name = name
        self.price = price
        self.rating = rating
 
    def __repr__(self):
        return f'{self.name}(${self.price}, {self.rating}★)'
 
products = [
    Product('Laptop', 999, 4.5),
    Product('Phone', 599, 4.8),
    Product('Tablet', 399, 4.2),
    Product('Monitor', 299, 4.7)
]
 
# Sort by price
by_price = sorted(products, key=lambda p: p.price)
print(by_price)
 
# Sort by rating (descending)
by_rating = sorted(products, key=lambda p: -p.rating)
print(by_rating)
 
# Sort by value score (rating / price * 100)
by_value = sorted(products, key=lambda p: (p.rating / p.price) * 100, reverse=True)
print(by_value)

Alternativ kannst du die Methode __lt__ (less than) implementieren, um das Standard-Sortierverhalten festzulegen:

class Student:
    def __init__(self, name, gpa):
        self.name = name
        self.gpa = gpa
 
    def __lt__(self, other):
        return self.gpa > other.gpa  # Higher GPA comes first
 
    def __repr__(self):
        return f'{self.name}({self.gpa})'
 
students = [Student('Alice', 3.8), Student('Bob', 3.9), Student('Charlie', 3.7)]
print(sorted(students))  # [Bob(3.9), Alice(3.8), Charlie(3.7)]

Case-insensitives Sortieren von Strings

String-Vergleiche sind standardmäßig case-sensitiv, wodurch Großbuchstaben vor Kleinbuchstaben einsortiert werden. Nutze str.lower() oder str.casefold() für case-insensitives Sortieren.

# Case-sensitive sorting (default)
words = ['apple', 'Banana', 'cherry', 'Date']
print(sorted(words))  # ['Banana', 'Date', 'apple', 'cherry']
 
# Case-insensitive sorting
print(sorted(words, key=str.lower))  # ['apple', 'Banana', 'cherry', 'Date']
 
# Using casefold for Unicode handling
international = ['café', 'CAFÉ', 'Apple', 'apple']
print(sorted(international, key=str.casefold))

Garantie für stabile Sortierung und der Timsort-Algorithmus

Python verwendet den Timsort-Algorithmus, der stabile Sortierung garantiert. Stabilität bedeutet, dass Elemente mit gleichen Keys ihre ursprüngliche relative Reihenfolge beibehalten.

# Stable sort preserves original order for equal elements
data = [
    ('Alice', 85),
    ('Bob', 92),
    ('Charlie', 85),  # Same score as Alice
    ('David', 92)     # Same score as Bob
]
 
# Sort by score only - original order preserved for ties
by_score = sorted(data, key=lambda x: x[1])
print(by_score)
# [('Alice', 85), ('Charlie', 85), ('Bob', 92), ('David', 92)]
# Alice appears before Charlie (both 85) because she came first

Diese Stabilität ermöglicht mehrstufiges Sortieren in mehreren Durchläufen:

# Multi-pass sorting using stability
records = [
    {'name': 'Alice', 'dept': 'HR', 'salary': 60000},
    {'name': 'Bob', 'dept': 'IT', 'salary': 75000},
    {'name': 'Charlie', 'dept': 'HR', 'salary': 65000},
    {'name': 'David', 'dept': 'IT', 'salary': 70000}
]
 
# First sort by salary
records.sort(key=lambda x: x['salary'], reverse=True)
# Then sort by department (stable, so salary order preserved within dept)
records.sort(key=lambda x: x['dept'])
 
for r in records:
    print(f"{r['dept']}: {r['name']} (${r['salary']})")
# HR: Charlie ($65000)
# HR: Alice ($60000)
# IT: Bob ($75000)
# IT: David ($70000)

Performance-Vergleich: Sortiermethoden

Pythons Sortierung hat im Worst Case eine Zeitkomplexität von O(n log n) und ist damit für die meisten Datensätze effizient. Unterschiedliche Ansätze passen zu unterschiedlichen Szenarien:

MethodeZeitkomplexitätSpeicherAnwendungsfall
list.sort()O(n log n)O(1)In-place-Sortierung, große Listen
sorted()O(n log n)O(n)Original bewahren, beliebige Iterables sortieren
heapq.nsmallest(k, items)O(n log k)O(k)Top-k-Elemente aus großem Datensatz
heapq.nlargest(k, items)O(n log k)O(k)Bottom-k-Elemente aus großem Datensatz
bisect.insort(list, item)O(n)O(1)Sortierte Liste bei Inserts beibehalten
import heapq
 
# When you only need top 3 scores from 1 million records
scores = list(range(1000000))
top_3 = heapq.nlargest(3, scores)  # Much faster than sorted()[-3:]
print(top_3)  # [999999, 999998, 999997]
 
# When you need bottom 5 values
bottom_5 = heapq.nsmallest(5, scores)
print(bottom_5)  # [0, 1, 2, 3, 4]

Zum Beibehalten einer sortierten Liste bei häufigen Einfügungen:

import bisect
 
# Maintain sorted list efficiently
sorted_list = []
for value in [5, 2, 8, 1, 9, 3]:
    bisect.insort(sorted_list, value)
 
print(sorted_list)  # [1, 2, 3, 5, 8, 9]

functools.cmp_to_key für Legacy-Vergleichsfunktionen

Python 2 nutzte Vergleichsfunktionen, die -1, 0 oder 1 zurückgeben. Python 3 verlangt key-Funktionen, aber functools.cmp_to_key konvertiert alte Vergleichsfunktionen.

from functools import cmp_to_key
 
# Custom comparison: sort by remainder when divided by 3
def compare_mod3(x, y):
    return (x % 3) - (y % 3)
 
numbers = [10, 11, 12, 13, 14, 15]
sorted_nums = sorted(numbers, key=cmp_to_key(compare_mod3))
print(sorted_nums)  # [12, 15, 10, 13, 11, 14]
# Groups: [12,15] (mod 0), [10,13] (mod 1), [11,14] (mod 2)
 
# Complex comparison: version strings
def compare_versions(v1, v2):
    parts1 = list(map(int, v1.split('.')))
    parts2 = list(map(int, v2.split('.')))
 
    for p1, p2 in zip(parts1, parts2):
        if p1 != p2:
            return p1 - p2
    return len(parts1) - len(parts2)
 
versions = ['1.10.2', '1.9.0', '1.10.15', '2.0.0', '1.10']
sorted_versions = sorted(versions, key=cmp_to_key(compare_versions))
print(sorted_versions)  # ['1.9.0', '1.10', '1.10.2', '1.10.15', '2.0.0']

Sortieren mit None-Werten

None-Werte verursachen Vergleichsfehler, wenn sie mit anderen Typen gemischt werden. Behandle sie explizit, indem du sie an den Anfang oder ans Ende setzt.

# None values cause errors
data = [3, None, 1, 5, None, 2]
# sorted(data)  # TypeError: '<' not supported between 'NoneType' and 'int'
 
# Place None values at the end
sorted_data = sorted(data, key=lambda x: (x is None, x))
print(sorted_data)  # [1, 2, 3, 5, None, None]
 
# Place None values at the beginning
sorted_data = sorted(data, key=lambda x: (x is not None, x))
print(sorted_data)  # [None, None, 1, 2, 3, 5]
 
# Replace None with specific value for sorting
sorted_data = sorted(data, key=lambda x: x if x is not None else float('-inf'))
print(sorted_data)  # [None, None, 1, 2, 3, 5]

Für Dictionaries mit potenziell fehlenden Keys:

records = [
    {'name': 'Alice', 'score': 85},
    {'name': 'Bob'},  # Missing score
    {'name': 'Charlie', 'score': 92},
    {'name': 'David'}  # Missing score
]
 
# Sort with default value for missing keys
sorted_records = sorted(records, key=lambda x: x.get('score', 0))
print([r['name'] for r in sorted_records])
# ['Bob', 'David', 'Alice', 'Charlie']

Praxisbeispiel: Schülerleistungen ranken

Dieses Beispiel zeigt mehrere Sortiertechniken kombiniert, um ein umfassendes Ranking-System zu erstellen:

class StudentRecord:
    def __init__(self, name, test_scores, attendance, extra_credit=0):
        self.name = name
        self.test_scores = test_scores
        self.attendance = attendance
        self.extra_credit = extra_credit
 
    @property
    def average_score(self):
        return sum(self.test_scores) / len(self.test_scores) if self.test_scores else 0
 
    @property
    def final_grade(self):
        base = self.average_score * 0.8 + self.attendance * 0.2
        return min(100, base + self.extra_credit)
 
    def __repr__(self):
        return f'{self.name}: {self.final_grade:.1f}'
 
students = [
    StudentRecord('Alice', [85, 90, 88], 95, 5),
    StudentRecord('Bob', [92, 88, 95], 80, 0),
    StudentRecord('Charlie', [78, 82, 80], 100, 10),
    StudentRecord('David', [90, 92, 88], 90, 2),
    StudentRecord('Eve', [85, 85, 85], 95, 0)
]
 
# Rank by final grade (highest first), then name
rankings = sorted(students, key=lambda s: (-s.final_grade, s.name))
 
print("Student Rankings:")
for rank, student in enumerate(rankings, 1):
    print(f"{rank}. {student}")

Praxisbeispiel: Dateilisten verarbeiten

Das Sortieren von Datei-Metadaten erfordert den Umgang mit verschiedenen Datentypen und benutzerdefinierter Sortierlogik:

import os
from datetime import datetime
 
class FileInfo:
    def __init__(self, path):
        self.name = os.path.basename(path)
        self.path = path
        self.size = os.path.getsize(path)
        self.modified = os.path.getmtime(path)
        self.extension = os.path.splitext(path)[1].lower()
 
    def __repr__(self):
        size_kb = self.size / 1024
        mod_time = datetime.fromtimestamp(self.modified).strftime('%Y-%m-%d %H:%M')
        return f'{self.name} ({size_kb:.1f} KB, {mod_time})'
 
# Simulate file information
files = [
    FileInfo('/data/report.pdf'),
    FileInfo('/data/summary.txt'),
    FileInfo('/data/analysis.xlsx'),
    FileInfo('/data/backup.pdf'),
]
 
# Sort by extension, then size (largest first)
by_type_size = sorted(files, key=lambda f: (f.extension, -f.size))
 
# Sort by modification time (most recent first)
by_recent = sorted(files, key=lambda f: -f.modified)
 
# Sort by size, handling different units
def format_size(bytes_size):
    if bytes_size < 1024:
        return f"{bytes_size} B"
    elif bytes_size < 1024 * 1024:
        return f"{bytes_size/1024:.1f} KB"
    else:
        return f"{bytes_size/(1024*1024):.1f} MB"
 
by_size = sorted(files, key=lambda f: f.size, reverse=True)
for f in by_size:
    print(f"{f.name}: {format_size(f.size)}")

Interaktives Datensortieren mit PyGWalker

Wenn du mit großen Datensätzen arbeitest, die visuelle Exploration und interaktives Sortieren erfordern, transformiert PyGWalker pandas DataFrames in Tableau-ähnliche Interfaces. Statt komplexe Sortierlogik zu schreiben, kannst du Spalten per Drag-and-drop sortieren, filtern und Daten visuell analysieren:

import pandas as pd
import pygwalker as pyg
 
# Create sample sales data
sales_data = pd.DataFrame({
    'product': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard'] * 100,
    'region': ['North', 'South', 'East', 'West', 'Central'] * 100,
    'revenue': [999, 599, 399, 299, 49] * 100,
    'units_sold': [50, 120, 80, 95, 200] * 100,
    'date': pd.date_range('2024-01-01', periods=500)
})
 
# Launch interactive visualization
pyg.walk(sales_data)

PyGWalker ermöglicht:

  • Sortieren nach mehreren Spalten mit visuellem Feedback
  • Dynamisches Filtern in Kombination mit Sortierung
  • Sortieren nach berechneten Feldern, ohne Code zu schreiben
  • Exportieren sortierter Ansichten als Charts oder Tabellen

Dieser Ansatz funktioniert besonders gut, wenn du unbekannte Datensätze explorierst oder Ergebnisse an nicht-technische Stakeholder präsentierst, die Datenmuster verstehen müssen, ohne Python-Code auszuführen.

FAQ

Was ist der Unterschied zwischen sorted() und list.sort() in Python?

Die sorted()-Funktion gibt eine neue sortierte Liste zurück und funktioniert mit jedem Iterable, während das Original unverändert bleibt. Die list.sort()-Methode verändert die Liste in place, gibt None zurück und funktioniert nur mit Listenobjekten. Nutze sorted(), um Originaldaten zu bewahren oder Nicht-Listen-Sequenzen wie Tuples zu sortieren; nutze list.sort() für Speichereffizienz beim Sortieren großer Listen.

Wie sortiere ich eine Liste in Python absteigend?

Füge den Parameter reverse=True zu sorted() oder list.sort() hinzu. Beispiel: sorted([3, 1, 4], reverse=True) ergibt [4, 3, 1]. Das funktioniert mit jedem Datentyp mit natürlicher Ordnung, einschließlich Zahlen, Strings und Datumswerten.

Kann ich ein Dictionary in Python nach Wert sortieren?

Dictionaries selbst haben im traditionellen Sinn keine Ordnung, aber du kannst ihre Items nach Werten sortieren, indem du sorted() mit einer key-Funktion nutzt: sorted(dict.items(), key=lambda x: x[1]). Das gibt eine Liste von Tuples zurück, sortiert nach Wert. Bei Bedarf kannst du mit dict(sorted(...)) wieder in ein Dictionary umwandeln – die Reihenfolge bleibt allerdings nur in Python 3.7+ erhalten.

Wie sortiere ich eine Liste von Dictionaries nach einem bestimmten Key?

Nutze sorted() mit einer Lambda-Funktion, die den Key extrahiert: sorted(list_of_dicts, key=lambda x: x['keyname']). Für bessere Performance nutze operator.itemgetter: sorted(list_of_dicts, key=itemgetter('keyname')). Beide Ansätze funktionieren für Sortierung nach einem oder mehreren Keys.

Welche Zeitkomplexität hat Pythons Sortierfunktion?

Pythons sorted() und list.sort() verwenden den Timsort-Algorithmus, der eine Worst-Case-Zeitkomplexität von O(n log n) und eine Best-Case-Komplexität von O(n) für teilweise vorsortierte Daten hat. Die Speicherkomplexität ist O(n) für sorted() (erstellt eine neue Liste) und O(1) für list.sort() (in place). Um Top-k-Elemente aus großen Datensätzen zu finden, bietet heapq.nlargest() eine Komplexität von O(n log k).

Wie gehe ich beim Sortieren mit None-Werten um?

None-Werte verursachen Vergleichsfehler, wenn sie mit anderen Typen gemischt werden. Nutze eine key-Funktion, die sie an den Anfang oder ans Ende setzt: sorted(data, key=lambda x: (x is None, x)) platziert None am Ende, während sorted(data, key=lambda x: (x is not None, x)) sie an den Anfang setzt. Für Dictionaries mit fehlenden Keys verwende x.get('key', default_value), um einen Fallback zu definieren.

Ist Pythons Sortierung stabil?

Ja. Pythons Sortierung ist garantiert stabil: Elemente mit gleichem Key behalten ihre ursprüngliche relative Reihenfolge. Das ermöglicht Multi-Pass-Sorting, bei dem du nach einem Kriterium und anschließend nach einem weiteren sortierst, wobei die erste Sortierung bei Gleichständen erhalten bleibt. Diese Stabilität wird durch den Timsort-Algorithmus garantiert.

Fazit

Pythons Sortiermöglichkeiten bieten leistungsstarke Werkzeuge, um Daten effizient zu organisieren. Die Unterscheidung zwischen sorted() und list.sort() unterstützt speicherbewusste Entscheidungen, während der key-Parameter und Lambda-Funktionen anspruchsvolle benutzerdefinierte Sortierlogik ermöglichen. Wenn du stabile Sortierung, Mehrkriterien-Sortierung und Performance-Eigenschaften verstehst, kannst du für jedes Szenario den passenden Ansatz wählen.

Ob du Schülerleistungen rankst, Datei-Metadaten verarbeitest oder Business-Kennzahlen analysierst: Diese Sortiertechniken bilden das Fundament für Workflows zur Datenmanipulation. Für visuelle Datenexploration und interaktives Sortieren erweitert PyGWalker diese Möglichkeiten durch Drag-and-drop-Interfaces, die programmatisches Sortieren sinnvoll ergänzen.

Beherrsche diese Sortiermuster, um saubereren Code zu schreiben, Performance zu verbessern und komplexe Aufgaben der Datenorganisation souverän zu lösen.

📚