Eine Menge (set) speichert Elemente ohne Doppelte und ohne feste Reihenfolge. Sie steht in geschweiften Klammern. Mengen sind ideal, um Duplikate zu entfernen und um schnell zu prüfen, ob etwas enthalten ist.
farben = {"rot", "grün", "blau", "rot"} # "rot" nur einmal
print(len(farben))
print("rot" in farben)
leer = set() # {} wäre ein leeres Dictionary!
print(type(leer), type({}))3 True <class 'set'> <class 'dict'>
Duplikate entfernen
zahlen = [1, 2, 2, 3, 3, 3, 4]
einmalig = set(zahlen)
print(len(einmalig))
print(sorted(einmalig))4 [1, 2, 3, 4]
Die Reihenfolge einer Menge ist nicht festgelegt. Brauchst du sie sortiert, nimm sorted().
Hinzufügen und entfernen
s = {1, 2, 3}
s.add(4)
s.add(2) # schon vorhanden: keine Wirkung
s.discard(10) # nicht vorhanden: kein Fehler
s.remove(1) # nicht vorhanden wäre ein KeyError
print(sorted(s))[2, 3, 4]
Elemente einer Menge müssen hashbar sein: Zahlen, Texte und Tupel dürfen hinein, Listen und andere Mengen nicht.
Mengenoperationen
Wie in der Mathematik:
| Operation | Schreibweise | Bedeutung |
|---|---|---|
| Vereinigung | a | b | alles aus beiden |
| Schnitt | a & b | nur was in beiden steckt |
| Differenz | a - b | in a, aber nicht in b |
| Symmetrische Differenz | a ^ b | in genau einer der beiden |
| Teilmenge | a <= b | alles aus a steckt in b |
a = {1, 2, 3, 4}
b = {3, 4, 5}
print(sorted(a | b))
print(sorted(a & b))
print(sorted(a - b))
print(sorted(a ^ b))
print({3, 4} <= a)[1, 2, 3, 4, 5] [3, 4] [1, 2] [1, 2, 5] True
Praktisches Beispiel: Gemeinsamkeiten finden
python_kurs = {"Mia", "Tom", "Lea"}
java_kurs = {"Tom", "Ben", "Lea", "Zoe"}
print("In beiden:", sorted(python_kurs & java_kurs))
print("Nur Python:", sorted(python_kurs - java_kurs))
print("Alle:", sorted(python_kurs | java_kurs))In beiden: ['Lea', 'Tom'] Nur Python: ['Mia'] Alle: ['Ben', 'Lea', 'Mia', 'Tom', 'Zoe']
Geschwindigkeit
Die Prüfung x in menge ist auch bei Millionen Elementen praktisch sofort, während x in liste die Liste Stück für Stück durchsucht. Bei großen Datenmengen lohnt sich daher die Umwandlung in eine Menge.
Merke
- Menge:
{a, b, c}, keine Doppelten, keine feste Reihenfolge; leere Menge:set() add,discard,remove; Mengen sind veränderlich|Vereinigung,&Schnitt,-Differenz,^symmetrische Differenz- Elemente müssen hashbar sein (keine Listen)
x in mengeist sehr schnell
Aufgabe
Gegeben sind zwei Listen mit E-Mail-Adressen. Finde heraus, welche Adressen in beiden Listen vorkommen.