Hintergrund:
Der Typ set (Menge) wurde in Python 2.4 eingeführt und bietet eine bequeme und schnelle Möglichkeit, einzigartige unveränderliche Elemente mit Unterstützung für mengenmäßige Operationen (Vereinigung, Schnittmenge usw.) zu speichern. Mengen basieren auf Hash-Tabellen.
Problem: Viele Benutzer haben kein Verständnis für die Unterschiede zwischen set und list, die Besonderheiten der Speicherung von Elementen in einem set (Unordnung, nur hashbare Objekte) sowie die Nuancen bei der Verwendung von Mengen zur Optimierung von Suchen, Überprüfungen der Einzigartigkeit oder Arbeiten mit großen Datensätzen.
Lösung:
Set ist ein veränderlicher, ungeordneter Container für einzigartige hashbare Objekte. Unterstützt schnelle Operationen wie Mitgliedschaftsprüfung, Vereinigung, Schnittmenge, Differenz und symmetrische Differenz. Eingebaute Methoden: add, remove, discard, update, intersection, difference, union, symmetric_difference und andere.
Beispielcode:
nums = {1, 3, 5, 7} nums.add(9) nums.update([5, 10]) # 5 ist bereits vorhanden, nur 10 wird hinzugefügt other = {3, 9, 11} inter = nums & other # Schnittmenge {3, 9} # Mitgliedschaftsprüfung — schneller als bei list y = 11 if y in nums: print('Ist da!')
Wesentliche Merkmale:
in ist unglaublich schnell (O(1) im Durchschnitt), im Gegensatz zu einer Liste (O(n)).Kann man eine Liste oder eine andere Menge in ein set hinzufügen?
Antwort: Nein, das ist nicht möglich. Nur hashbare (unveränderliche) Objekte sind zulässig: Strings, Zahlen, Tuples. Listen und Mengen sind veränderlich und können nicht hinzugefügt werden.
Beispielcode:
s = set() s.add([1, 2]) # TypeError: unhashable type: 'list' s.add((1, 2)) # OK
Was ist der Unterschied zwischen den Methoden remove und discard bei set?
Antwort: remove(value) wirft eine Ausnahme KeyError, wenn der Wert nicht gefunden wird. discard(value) macht stillschweigend nichts, wenn ein solches Element nicht vorhanden ist.
Beispielcode:
s = {1, 2, 3} s.remove(4) # KeyError s.discard(4) # Keine Fehler
Ist eine leere Menge {} ein set-Objekt?
Antwort: Nein. Das Literal {} ist immer ein leeres dict. Um ein leeres set zu erstellen, muss die Funktion set() verwendet werden.
Beispielcode:
empty_set = {} # Das ist ein dict empty_set_real = set() # Das ist ein set
Negativer Fall
Es wird versucht, einzigartige Objekte in einer Liste zu speichern und die Überprüfung über "in" durchzuführen, um Duplikate bei großen Datenmengen zu finden.
Vorteile:
Nachteile:
Positiver Fall
Verwendung von set zur Suche nach Schnittmengen und einzigartigen Daten in großen Arrays (z.B. E-Mail-Kampagnen), wodurch keine Duplikate auftreten und die Operation schnell erfolgt.
Vorteile:
Nachteile: