Mengen managen über: set
und frozenset
Über das Objekt set
ist in Python das Konzept der Mathematik mit Mengen und Mengenlehre nachgebaut.
In einem Set steckt eine ungeordnete Sammlung von Objekten, die nur 1-Mal vorkommen!
Aufbau eines Sets über geschweifte Klammern:
set_a = { 1, 2, 3, 'A', 'B', 'C' }
In einem Set steckt eine ungeordnete Sammlung von Objekten, die nur 1-Mal vorkommen! Dies sieht man sehr schön, wenn man ein Tupel mit Dopplungen in ein set
umwandelt:
werte_als_tupel = (1,1,1,3,5,3,4,5,3)
werte_als_set = set(werte_als_tupel)
print(werte_als_set)
Als Ergebnis erhalten wir dann ein Set mit jeweils nur einmalig vorkommenden Werten:
{1, 3, 4, 5}
Mengenlehre mit Set
Das Besondere ist nun, dass über 2 Sets Mengenlehre mit „Schnittmenge“, „Vereinigungsmenge“, „A ohne B“ usw. durchgeführt werden kann.
set_a = { 1, 2, 3, 'A', 'B', 'C' }
set_b = { 2, 3, 'B', 'D' }
Wollen wir nun die Schnittmenge (also was in beiden Mengen vorkommt) herausfiltern, läuft dies über das kaufmännische Und &
:
set_a = { 1, 2, 3, 'A', 'B', 'C' }
set_b = { 2, 3, 'B', 'D' }
print( set_a & set_b )
Als Ergebnis erhalten wir:
{2, 3, 'B'}
Im folgenden Beispiel die üblichen Verdächtigen bei der Mengenlehre:
set_a = { 1, 2, 3, 'A', 'B', 'C' }
set_b = { 2, 3, 'B', 'D' }
print("Set A:")
print(set_a)
print("Set B:")
print(set_b)
print()
print("Schnittmenge über &")
print( set_a & set_b )
print()
print("Vereinigungsmenge über |")
print( set_a | set_b )
print()
print("Differenzmenge über - ")
print( set_a - set_b )
print()
print("Symmmetrische Differnz (entweder-oder) über ^")
print( set_a ^ set_b )
print()
print("Obermenge von > ")
print( set_a > set_b )
Und unsere Ergebnisse:
Set A:
{1, 2, 3, 'A', 'B', 'C'}
Set B:
{2, 3, 'D', 'B'}
Schnittmenge über &
{2, 3, 'B'}
Vereinigungsmenge über |
{1, 2, 3, 'A', 'B', 'C', 'D'}
Differenzmenge über -
{'C', 1, 'A'}
Symmetrische Differenz (entweder-oder) über ^
{1, 'A', 'C', 'D'}
Obermenge von >
False
frozenset
und Unterschied zu set
set-Objekte sind veränderbar – diese werden eingefroren und somit unveränderbar über frozenset
.
Die Umwandlung kann man vorwärts wie rückwärts machen, sprich aus einem Set ein Frozenset und rückwärts.
set_a = { 1, 2, 3, 'A', 'B', 'C' }
set_c = frozenset(set_a)
print(set_c)
print(type(set_c))
Ergebnis:
frozenset({'C', 1, 2, 3, 'B', 'A'})
<class 'frozenset'>
Und locker aus der Hüfte wieder rückwärts:
set_a = { 1, 2, 3, 'A', 'B', 'C' }
set_c = frozenset(set_a)
print(set_c)
print(type(set_c))
set_c = set(set_c)
print(set_c)
print(type(set_c))
Und das Ergebnis:
frozenset({1, 2, 3, 'C', 'B', 'A'})
<class 'frozenset'>
{1, 2, 3, 'C', 'B', 'A'}
<class 'set'>
Beispiel Anzahl Buchstaben in Text zählen mit Hilfe von set
Anhand der Anweisung set
werten wir einen Text aus und zählen die Anzahl der Buchstaben. Dabei wird im ersten Code es Schritt für Schritt gemacht. Dasselbe kommt dann nochmals komprimiert.
inhalt = "anzahl"
# doppelte Buchstaben entfernen
buchstaben = set(inhalt)
print(buchstaben)
# zum Sortieren aus dem SET eine Liste machen
buchstabenliste = list(buchstaben)
print(buchstabenliste)
# sortieren
buchstabensortiert = sorted(buchstabenliste)
print(buchstabensortiert)
# der Reihen nach durchlaufen und Anzahl zählen
# die for-Schleife kommt in einem späteren Kapitel
for einzelbuchstabe in buchstabensortiert:
print(einzelbuchstabe ,": Anzahl ", inhalt.count(einzelbuchstabe))
Als Ergebnis erhalten wir:
{'n', 'a', 'l', 'z', 'h'}
['n', 'a', 'l', 'z', 'h']
['a', 'h', 'l', 'n', 'z']
a : Anzahl 2
h : Anzahl 1
l : Anzahl 1
n : Anzahl 1
z : Anzahl 1
Und nun dasselbe in 3 Zeilen:
inhalt = "Buchstaben zählen"
for einzelbuchstabe in sorted(list(set(inhalt))):
print(einzelbuchstabe ,": Anzahl ", inhalt.count(einzelbuchstabe))
Als Ergebnis erhalten wir:
: Anzahl 1
B : Anzahl 1
a : Anzahl 1
b : Anzahl 1
c : Anzahl 1
e : Anzahl 2
h : Anzahl 2
l : Anzahl 1
n : Anzahl 2
s : Anzahl 1
t : Anzahl 1
u : Anzahl 1
z : Anzahl 1
ä : Anzahl 1