Von den wichtigsten in Python integrierten Datentypen ist der Satz einer der am wenigsten diskutierten, aber auch einer der leistungsstärksten. Mit einem Python-Set können Sie Sammlungen von Objekten erstellen, bei denen jedes Objekt für die Sammlung eindeutig ist, und es arbeitet mit der Geschwindigkeit und Effizienz der Python-Wörterbücher.
Da die Python-Sets jedoch nicht so häufig diskutiert werden wie die Listen oder Wörterbücher, kann man leicht übersehen, wie Sets Ihre Python-Apps intelligenter und eleganter machen können. Lass uns das beheben!
Python-Set-Grundlagen
Sets werden mit einer Syntax definiert, die an den Wörterbuchtyp von Python erinnert:
my_set = 1,2,3,4
Die Tatsache, dass dies ein wenig wie ein Wörterbuch aussieht, ist kein Zufall. Sie können sich eine Menge als ein Wörterbuch vorstellen, in dem nur Schlüssel und keine Werte gespeichert sind. Tatsächlich werden viele der Mechanismen unter Pythons Haube für Sets mit demselben Code wie für Wörterbücher erstellt.
Sie können auch ein Set mit dem erstellen set()
eingebaut, was jede iterable nimmt:
my_set = set([1,2,3,4])
Set-Mitglieder können jeden Hash-Typ enthalten – im Grunde jedes Objekt in Python, von dem garantiert werden kann, dass es sich während seiner Lebensdauer nicht ändert. Zahlen und Zeichenfolgen sind alle in Ordnung, ebenso wie Instanzen von benutzerdefinierten Klassen. (Auch wenn ihre Eigenschaften Im Laufe der Zeit ändern sich die Instanzen sich nicht ändern.) Auch dies entspricht genau der Funktionsweise der Tasten in Pythons Wörterbüchern.
Wenn Sie versuchen, einen Satz mit redundanten Mitgliedern zu definieren, werden die Redundanzen automatisch entfernt, wobei zuvor definierte Mitglieder Vorrang haben. Zum Beispiel, wenn wir definiert haben my_set
wie 1,2,3,2,4,5
wäre das Ergebnis 1,2,3,4,5
.
Wird für Python-Sets verwendet
Eine leistungsstarke und häufig verwendete Verwendung für Sets ist das Deduplizieren der Mitglieder einer Sammlung oder der von einer Iterable generierten Ausgabe. Wenn Sie beispielsweise eine Liste haben, können Sie die Liste schnell deduplizieren, indem Sie aus ihrem Inhalt einen Satz erstellen:
list_1 = [1,2,3,4,3,4,2,4,5,3]
set_1 = set(list_1)
# yields 1,2,3,4,5
(Beachten Sie, dass die ursprüngliche Liste erhalten bleibt.)
Dies ist weitaus schneller als das Durchlaufen der Liste und das manuelle Testen auf Duplikate. Sie können dies auch für tun irgendein iterierbar, nicht nur eine Liste, obwohl Listen eine häufige Quelle sind. Wenn Sie dies beispielsweise mit einer Zeichenfolge tun, erhalten Sie eine Menge, die alle eindeutigen Zeichen in der Zeichenfolge enthält:
s1="Hello there"
set(s1)
# yields ' ', 'r', 'l', 't', 'e', 'h', 'o', 'H'
Beachten Sie, dass diese Technik nur funktioniert, wenn alle Objekte in der Liste hashbar sind. Du bekommst eine TypeError
Wenn Sie versuchen, ein nicht zerlegbares Objekt hinzuzufügen. Außerdem können Sie keinen Parameter übergeben, der nicht verwischbare Objekte ignoriert. Wenn Sie also Zweifel haben, was hashbar ist oder nicht, müssen Sie die Sammlung und durchlaufen .add()
jedes Element manuell testen, während Sie gehen.
Eine andere häufige Verwendung für Mengen besteht darin, mithilfe der nachstehend beschriebenen Methoden für Obermengen / Teilmengen schnell zu testen, ob eine kleine Sammlung von Objekten in einer größeren Sammlung vorhanden ist, oder umgekehrt. Beachten Sie, dass dies am besten funktioniert, wenn Sie die größere der beiden Sammlungen einmal in einen Satz konvertieren und dann mehrmals testen können, da der Aufwand für das Konvertieren einer Liste in einen Satz (insbesondere eine lange Liste) die Leistungsgewinne möglicherweise übersteigt in erster Linie mit Sets. Im Großen und Ganzen ist das Testen der festgelegten Mitgliedschaft im Allgemeinen schneller als das Durchlaufen von Objekten und das manuelle Testen der Mitgliedschaft.
Hinzufügen und Entfernen von Mitgliedern von Python-Sets
Wenn Sie Mitglieder zu Sets hinzufügen und daraus entfernen möchten, verwenden Sie die .add()
und .remove()
Methoden. Zum Beispiel, my_set.add(5)
würde aktualisieren my_set
einschließen 5
, und my_set.remove(5)
würde entfernen 5
wenn es vorhanden wäre.
Wenn du es versuchst .remove()
Etwas aus einem Set, das nicht da ist, erhalten Sie eine KeyError
– genauso, als ob Sie versuchen, auf einen Schlüssel in einem nicht vorhandenen Wörterbuch zu verweisen. Verwenden Sie, um etwas zu entfernen, ohne das Risiko eines Fehlers, wenn es nicht vorhanden ist .discard()
Anstatt von remove()
.
Sie können verwenden, um alle Elemente aus einem Satz zu löschen .clear()
oder weisen Sie die Variable einer leeren Menge zu:
my_set = set()
Gewerkschaften und Schnittpunkte mit Python-Sets
Sets unterstützen eine Reihe von Operationen, bei denen Sie zwei oder mehr Sets nehmen und daraus neue generieren. EIN Union von zwei Sätzen kombiniert die beiden zu einem einzigen Satz, wobei alle Duplikate entfernt werden:
set_1 = 1,2,3
set_2 = 4,5,6
set_3 = set_1.union(set_2)
# yields 1,2,3,4,5,6
Sie können auch den Pipe-Operator verwenden, um eine Vereinigung durchzuführen:
set_3 = set_1 | set_2
Auch dies ist eine praktische Möglichkeit, die Deduplizierung über mehrere Objektsammlungen hinweg durchzuführen.
Ein Überschneidung generiert eine neue Menge nur aus den Elementen, die mehreren Mengen gemeinsam sind:
set_1 = 1,2,3
set_2 = 2,3,4
set_3 = set_1.intersection(set_2)
# yields 2,3
Das &
Der Operator kann auch verwendet werden, um zwei Mengen (Vereinigung) zu kombinieren:
set_3 = set_1 & set_2
Many set operations can be expressed with operators, which we’ll illustrate below.
Differences with Python sets
if you want to find out which members two sets don’t have in common, you can use the difference()
Methode:
set_1 = 1,2,3
set_2 = 4,5,6
set_3 = set_1.difference(set_2)
# yields 1,2,3
set_3 = set_1 - set_2
# different way to express same operation
Eine Möglichkeit, dies auf Englisch auszudrücken, könnte sein: „Erstellen Sie einen neuen Satz, der alles in Satz 1 enthält ist nicht in Satz 2. ”
Im Gegensatz dazu, wenn wir verwendet set_3 = set_2.difference(set_1)
wären die Ergebnisse 4,5,6
.
Python-Sets unterstützen ebenfalls symmetrischer Unterschied Operationen. Die symmetrische Differenz gibt Elemente zurück, die sich in einem Satz befinden oder der andere, aber nicht beide.
set_1 = 1,2,3,4
set_2 = 4,5,6,7
set_3 = set_1.symmetric_difference(set_2)
# yields 1, 2, 3, 5, 6, 7
set_3 = set_1 ^ set_2
# operator version
Supersets und Subsets in Python
Sie sind wahrscheinlich inzwischen mit Pythons vertraut in
Operator, mit dem Sie nach dem Vorhandensein eines Zeichens in einer Zeichenfolge oder eines Objekts in einer Liste suchen können. Legt die Unterstützung fest in
auch:
set_1 = 1,2,3,4
1 in set_1 # this is True
5 in set_1 # this is False
Was wäre, wenn Sie das Vorhandensein aller Elemente eines Sets in einem anderen Set testen möchten? Sie können nicht verwenden in
dafür – Python wird denken, dass Sie auf das Vorhandensein testen des gesamten gesetzten Objekts, nicht seine einzelnen Elemente. Glücklicherweise bietet Python Möglichkeiten, solche Dinge mit anderen festgelegten Methoden zu überprüfen:
set_1 = 1,2,3,4
set_2 = 1,2# Tests if members of set_2 are in set_1:
set_2.issubset(set_1)
# Operator version:
set_2 <= set_1
# Tests if set_1 contains all members of set_2:
set_1.issuperset(set_2)
# Operator version:
set_1 >= set_2
Legen Sie Updates in Python fest
Bisher haben wir nur untersucht, wie neue Mengen aus Schnittpunkten oder Unterschieden bestehender Mengen generiert werden können. Mit Python können Sie auch einen Satz an Ort und Stelle mit Schnittpunkten oder Unterschieden aktualisieren:
# In-place update of set_1 with set_2:
set_1 |= set_2# In-place intersection of set_1 with set_2;
set_1 &= set_2
# In-place difference of set_1 with set_2:
set_1 -= set_2
# In-place symmetric difference of set_1 with set_2:
set_1 ^= set_2
In-Place-Updates sind praktisch, wenn Sie mit einem sehr großen Satz arbeiten und keine völlig neue Instanz des Satzes erstellen möchten (mit dem gesamten Aufwand, der mit einem solchen Vorgang verbunden ist). Stattdessen können Sie die Änderungen direkt am vorhandenen Satz vornehmen, was effizienter ist.
Gefrorene Sets in Python
Ich habe bereits erwähnt, dass Sets nur aus Dingen bestehen können, die hashbar sind. Da Mengen veränderbar sind, können sie selbst nicht als Mengenelemente oder Wörterbuchschlüssel verwendet werden. Aber es gibt eine Vielzahl von Sets namens gefrorenes Set Das ist nicht veränderbar und kann daher als Set-Element, als Wörterbuchschlüssel oder in jedem anderen Kontext verwendet werden, in dem Sie einen Hash-Typ benötigen.
Verwenden Sie einfach, um ein eingefrorenes Set zu erstellen frozenset()
So generieren Sie eine aus einer vorhandenen Menge oder iterierbar:
set_1 = 1,2,3,4
f_set = frozenset(set_1)
set_2 = f_set,2,3,4
Beachten Sie, dass ein eingefrorenes Set nach dem Erstellen nicht mehr geändert werden kann. Das .add()
und .remove()
Methoden funktionieren bei einem eingefrorenen Set nicht. Sie können ein eingefrorenes Set verwenden, um Set-Schnittpunkte oder -Differenzen zu generieren, solange Sie nicht versuchen, die Ergebnisse solcher Vorgänge direkt zu speichern.