Sets - Mengen
Ein Set ist eine Sammlung von Objekten. Diese Sammlung ist
- ungeordnet
- unveränderbar
Genauer: die einzelnen Objekte in einem Set sollten nicht verändert werden. Es können aber neue Objekte hinzugefügt werden oder aber bereits vorhandene Objekte gelöscht werden. - nicht indiziert
- Die Objekte im Set müssen hashable sein.
Sets werden genutzt, um mehrere Objekte ein einer Variablen abzuspeichern. Dabei werden keine Duplikate zu einem Set hinzugefügt.
Anlegen eines Sets
Man kann entweder ein leeres Set anlegen
myset = set()
## set()
oder das Set mit Inhalt anlegen
myset = { "item1","item2", "item3" }
## {'item2', 'item1', 'item3'}
Hinweis:
* Die Werte True und 1 werden in einem Set als ein
Wert betrachtet. Kommen beide vor, wird ein Wert als
Duplikat behandelt
* Die Werte False und 0 werden in einem Set als ein
Wert betrachtet. Kommen beide vor, wird ein Wert als
Duplikat behandelt
Beispiel
myset = { 0, 1, 2, True, False }
## {0, 1, 2}
Länge eines Sets
len(myset)
myset = { 1,2,3,4,5 }
## {1, 2, 3, 4, 5}
len(myset)
## 5
Zugriff auf ein Set
myset = { 1,2,3,4,5 }
## {1, 2, 3, 4, 5}
Zugriff auf alle Objekte in einem Set
for elem in myset:
print(elem)
Zugriff auf alle Objekte in einem Set als Enumeration
myset
## {1, 2, 3, 4, 5}
for count, obj in enumerate(myset):
print(f"count: {count} , obj: {obj}")
Ausgabe:
count: 0 , obj: 1
count: 1 , obj: 2
count: 2 , obj: 3
count: 3 , obj: 4
count: 4 , obj: 5
Sieh auch: enumerate in der Python Dokumentation.
Objekt ist in einem Set
object in myset
if 1 in myset:
print("in Set gefunden")
Objekt ist nicht in einem Set
object not in myset
if 42 not in myset:
print("nicht in Set gefunden")
Objekt zu einem Set hinzufügen
myset.add(6)
myset
## {1, 2, 3, 4, 5, 6}
Ist ein Objekt bereits in einem Set vorhanden, wird das Set nicht geändert
myset.add(1)
myset
## {1, 2, 3, 4, 5}
Ein Set zu einem Set hinzufügen
set1.update(set2)
Bereits vorhandene Objekte werden beim Update ignoriert
set1 = { 1,2,3,4,5 }
set2 = { 3,4,5,6,7,8 }
set1.update(set2)
set1
## {1, 2, 3, 4, 5, 6, 7, 8}
Ein Objekt aus einem Set löschen
myset.remove(objekt)
myset
## {1, 2, 3, 4, 5}
myset.remove(3)
myset
## {1, 2, 4, 5}
Wird beim Aufruf von remove ein Objekt angegeben, das nicht im Set enthalten ist, wird ein KeyError geworfen.
Alternativ kann man die Methode discard nutzen. Diese Methode wirft keinen KeyError, wenn das Objekt nicht im Set enthalten ist
myset
## {1, 2, 3, 4, 5}
myset.discard(42)
myset
## {1, 2, 3, 4, 5}
Für Sets gibt es auch die Methode pop.
objekt = myset.pop()
Da es auf Sets keinen Index gibt, wird mit dieser Methode ein zufälliges Objekt aus dem Set gelöscht. Die Methode gibt das gelöschte Objekt zurück.
Set leeren
myset.clear()
Set löschen
del myset
Set Operationen
Für die Beispiele werden die folgenden Sets verwendet
set1 = { 1,2,3,4,5 }
## {1, 2, 3, 4, 5}
set2 = { 3,4,5,6,7,8 }
## {3, 4, 5, 6, 7, 8}
Vereinigung
s1 | s2
## {1, 2, 3, 4, 5, 6, 7, 8}
s3 = s1.union(s2)
s3
## {1, 2, 3, 4, 5, 6, 7, 8}
Man kann mit union auch mehrere Sets vereinigen
myset = set1.union(set2, set3, set4)
Schnitt
s1 & s2
## {3, 4, 5}
Differenz
In s1, nicht in s2
s1 - s2
## {1, 2}
In s2, nicht in s1
s2 -s1
## {8, 6, 7}
frozenset
Set Objekte sind veränderbar. Mit Hilfe der Funktion frozenset werden Sets "eingefroren" und somit unveränderbar.
myset = { 1, 2, 3, 'A', 'B', 'C' }
## {'A', 1, 2, 3, 'B', 'C'}
myset_frozen = frozenset(myset)
## frozenset({'A', 1, 2, 3, 'B', 'C'})
type(myset_frozen)
## class 'frozenset'>
Set Comprehension
Set Comprehension bietet eine verkürzte Syntax zur Erzeugung und Manipulation von Python Sets.
Beispiel: Ein Set enthält Mailadressen. Bilde ein neues Set, dass nur die Mailadressen enthält, die auf ".com" enden.
emails_set = {
"alice@example.org",
"bob@example.com",
"johndoe@example.com",
"charlie@example.com",
"david@example.net",
}
emails_set
## {'alice@example.org', 'david@example.net', 'charlie@example.com', 'johndoe@example.com', 'bob@example.com'}
emails_com_set = {email for email in emails_set if email.endswith(".com")}
emails_com_set
## {'johndoe@example.com', 'bob@example.com', 'charlie@example.com'}