Python Tutorial
- jetzt Python programmieren lernen

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änische 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ächten 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'}

Symmmetrische Differnz (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