Historie der Frage:
Mengen (set) wurden in Python als eigener eingebauter Typ mit Python 2.4 eingeführt (zuvor wurden sie als externes Modul implementiert). Sie ermöglichen die effiziente Speicherung von einzigartigen, ungeordneten Elementen und unterstützen eine Vielzahl standardmäßiger Mengenoperationen: Vereinigung, Schnittmenge, Differenz, symmetrische Differenz und Teilmengenprüfung.
Problem:
Ohne set sind Listen zu verwenden, was zu ineffizienter Suche nach einzigartigen Elementen führt und die Algorithmen verlangsamt, die viele Mitgliedschaftsprüfungen erfordern. set wird mittels einer Hash-Tabelle implementiert, daher werden alle Such-, Hinzufüge- und Löschoperationen amortisiert in O(1) Zeit ausgeführt. Diese Struktur kann jedoch unerwartete Probleme verursachen – z. B. Verlust der Reihenfolge der Elemente, Einschränkungen der Typen von Elementen (sie müssen unveränderlich und hashierbar sein) und Missverständnisse über die Besonderheiten des Vergleichs von Mengen und deren Wechselwirkungen mit anderen Strukturen.
Lösung:
Verwenden Sie set, wenn nur einzigartige Elemente gespeichert und Mengenoperationen durchgeführt werden müssen. Es ist zu beachten, dass die Elemente hashierbar sein müssen (z. B. Zahlen, Zeichenfolgen, Tuple, aber nicht Listen und dict). Für die Arbeit mit set steht eine Vielzahl von eingebauten Methoden zur Verfügung (add, remove, union, intersection, difference, issubset usw.).
Beispielcode:
s1 = {1, 2, 3, 4} s2 = {3, 4, 5} print(s1 | s2) # {1, 2, 3, 4, 5} (Vereinigung) print(s1 & s2) # {3, 4} (Schnittmenge) print(s1 - s2) # {1, 2} (Differenz) print(3 in s1) # True (Mitgliedschaftsprüfung)
Wesentliche Merkmale:
Kann man veränderliche Typen (z. B. Listen) in ein set hinzufügen?
Nein, die Elemente einer Menge müssen hashierbar und unveränderlich sein. Eine Liste oder dict kann nicht in ein set hinzugefügt werden, Python wirft einen TypeError.
s = set() s.add([1, 2, 3]) # TypeError: unhashable type: 'list'
Bewahrt ein set die Reihenfolge der Elemente?
Nein. Bei der Erstellung eines sets ist die Reihenfolge der Elemente nicht garantiert, in der sie hinzugefügt wurden, insbesondere wenn sich die Größe der Menge ändert.
s = {5, 2, 8, 1} print(s) # Reihenfolge nicht definiert
Was unterscheidet set von frozenset und kann man frozenset als Element eines sets verwenden?
frozenset ist eine unveränderliche Variante von set. Es kann als Element eines anderen sets oder als Schlüssel eines dict verwendet werden, da es hashierbar ist.
fs = frozenset([1, 2, 3]) s = set() s.add(fs) # OK
Ein Entwickler wollte einzigartige Elemente speichern und wählte set, ohne die Reihenfolge ihrer Erscheinung zu berücksichtigen. Infolgedessen funktionierte ein Teil der Geschäftslogik, der von der Reihenfolge der Verarbeitung abhängig war, nicht mehr.
Vorteile:
Nachteile:
In einer Aufgabe zur schnellen Filterung einzigartiger Datensätze aus einer großen Menge wurde set gewählt, da nur die Tatsache der Einzigartigkeit wichtig war, nicht die Reihenfolge. Die Leistung stieg erheblich und der Code wurde vereinfacht.
Vorteile:
Nachteile: