Die Python-Funktion set() ist der Konstruktor des eingebauten Datentyps set — einer veränderbaren, ungeordneten Sammlung mit eindeutigen Elementen. Sets sind ideal für Deduplizierung, schnelle Mitgliedschafts-Tests (in ist O(1)) und mengentheoretische Operationen wie Vereinigung, Schnittmenge und Differenz.
Einleitung
Sets unterscheiden sich in drei Punkten von Listen:
- Keine Duplikate: Jedes Element kommt höchstens einmal vor.
- Keine Reihenfolge: Iteration liefert Elemente in interner Hash-Reihenfolge — nicht in Einfügereihenfolge.
- Schnelles
in: O(1) im Durchschnitt — bei Listen istinO(n).
Elemente in einem Set müssen hashable sein — also unveränderbar. Strings, Zahlen und Tupel funktionieren; Listen und Dicts nicht.
set() akzeptiert ein optionales Iterable. Die Literal-Syntax {1, 2, 3} ist schneller, aber set() ist nötig für ein leeres Set ({} ist ein leeres Dict!).
Syntax
set() # leeres Set
set(iterable) # aus Iterableiterable Eine Iterable mit hashable Elementen (Strings, Zahlen, Tupel ...).
Rückgabewert
Eine neue set-Instanz mit den eindeutigen Elementen des Iterables.
Beispiele
Aus Liste mit Duplikaten
Der häufigste Use-Case: schnelles Entfernen von Duplikaten aus einer Liste:
items = [1, 2, 2, 3, 3, 3, 4]
unique = set(items)
print(unique){1, 2, 3, 4}Leeres Set vs. leeres Dict
Achtung: {} ist ein Dict, nicht ein Set. Für ein leeres Set braucht es immer set():
a = set()
b = {}
print(type(a), type(b))<class 'set'> <class 'dict'>Set-Operationen
Sets unterstützen die klassischen mengentheoretischen Operationen über Operatoren — kürzer und ausdrucksstärker als Schleifen:
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a | b) # Vereinigung (union)
print(a & b) # Schnittmenge (intersection)
print(a - b) # Differenz
print(a ^ b) # symmetrische Differenz{1, 2, 3, 4, 5, 6}
{3, 4}
{1, 2}
{1, 2, 5, 6}Schnelle Mitgliedschaft
x in set ist deutlich schneller als x in list bei vielen Lookups — O(1) statt O(n):
groß = list(range(1_000_000))
gross_set = set(groß)
print(999_999 in gross_set) # O(1) — sehr schnellTruePraktische Beispiele
Deduplizieren bei Beibehaltung der Reihenfolge
Ein einfaches Set zerstört die Reihenfolge — wer sie erhalten will, nutzt dict.fromkeys():
items = ["b", "a", "c", "a", "b", "d"]
unique = list(dict.fromkeys(items))
print(unique)['b', 'a', 'c', 'd']Gemeinsame Elemente in mehreren Sammlungen
set.intersection(*sets) findet die gemeinsamen Elemente — ideal für "ist in allen Listen vorhanden?":
a = ["python", "go", "rust", "ruby"]
b = ["python", "java", "rust"]
c = ["python", "rust", "haskell"]
common = set(a) & set(b) & set(c)
print(common){'python', 'rust'}Differenz zwischen zwei Listen
a - b liefert alles, was nur in a ist — perfekt für "neue Items" oder "fehlende Items":
installed = {"numpy", "pandas", "requests"}
required = {"numpy", "pandas", "scikit-learn", "requests"}
missing = required - installed
print(f"Noch zu installieren: {missing}")Noch zu installieren: {'scikit-learn'}Praktische Hinweise
- Elemente müssen hashable sein — Listen und Dicts können nicht in einem Set liegen, Tupel schon.
{}ist ein Dict,set()ist ein leeres Set — häufige Stolperfalle.frozenset()für unveränderliche Sets, die selbst wieder Element eines anderen Sets sein können.- Reihenfolge nicht garantiert — wer Reihenfolge braucht, nutzt
dict.fromkeys()oderlistmit Dedup-Loop. - Verwandte Typen:
frozenset(immutable),dict(Key-Value),collections.Counter(mit Häufigkeit).