Python-Kurs / Sets für Eindeutigkeit und Mengenoperationen verwenden
Eine Menge, in Python set, speichert eindeutige hashbare Elemente und unterstützt Mitgliedschaftsprüfungen sowie Mengenoperationen. Beim Umwandeln in ein Set gehen Wiederholungszahlen und Positionsinformationen verloren; prüfen Sie vorher, ob diese Informationen benötigt werden.
Sets erstellen und Mengenoperationen lesen
Ein nichtleeres Set können Sie mit {"food", "books"} erzeugen. Für eine leere Menge verwenden Sie set(): Leere geschweifte Klammern {} erzeugen stattdessen ein Dictionary.
Elemente müssen hashbar sein. Zeichenketten sind dafür geeignet, Listen und Dictionaries können dagegen nicht direkt als Elemente verwendet werden. Ein Set hat keinen Positionszugriff wie used[0]. Verlassen Sie sich weder auf die angezeigte noch auf eine zufällig beobachtete Iterationsreihenfolge als fachlichen Bestandteil Ihrer Daten.
| Ausdruck | Bedeutung |
|---|---|
a | b |
Vereinigung: Elemente aus beiden Mengen |
a & b |
Schnittmenge: Elemente, die in beiden Mengen vorkommen |
a - b |
Differenz: Elemente in a, die nicht in b vorkommen |
a ^ b |
Symmetrische Differenz: Elemente, die in genau einer Menge vorkommen |
Bei der Differenz ist die Richtung wichtig: a - b und b - a beantworten verschiedene Fragen. Die Python-Referenz zu set und frozenset beschreibt die Operationen und Methoden.
Verwendete und erlaubte Kategorien vergleichen
Speichern Sie den vollständigen Code in sets.py, in UTF-8, im Übungsordner. Starten Sie python sets.py mit Ihrem Projektinterpreter; unter macOS oder Ubuntu kann außerhalb einer aktivierten Umgebung python3 der passende Befehl sein. Es werden keine Zusatzpakete und keine Eingabedateien benötigt.
used = {"food", "transport", "food"}
allowed = {"food", "books"}
print(sorted(used))
print(sorted(used & allowed))
print(sorted(used - allowed))
used.discard("missing")
print("food" in used)
Erwartete Ausgabe:
['food', 'transport']
['food']
['transport']
True
Der doppelte Eintrag food bleibt in used nur einmal enthalten. Die erste Zeile zeigt die beiden eindeutigen verwendeten Kategorien. Die Schnittmenge enthält nur food; die Differenz used - allowed findet transport als verwendete, aber nicht erlaubte Kategorie.
sorted sorgt für eine nachvollziehbare Reihenfolge der Ausgabelisten. Es liefert eine neue Liste und verwandelt das Set nicht in eine sortierte Datenstruktur. discard("missing") akzeptiert, dass der Wert fehlt. Die abschließende Prüfung "food" in used ergibt True.
Dublettenbereinigung und Datenprüfung unterscheiden
Mit Sets können Sie feststellen, welche unterschiedlichen Kategorien vorkommen. Sie erfahren daraus nicht mehr, wie oft jede Kategorie im ursprünglichen Datensatz vorkam. Falls Häufigkeiten oder Summen erforderlich sind, behalten Sie die ursprünglichen Datensätze und aggregieren Sie gezielt, etwa mit dem Verfahren aus der Dictionary-Übung zu Kategoriesummen.
Zwei Zahlungen mit demselben Betrag sind nicht zwangsläufig dieselbe Zahlung. Aus [8000, 8000] wird mit set eine Menge mit einem Wert; deren Summe ist 8000 statt 16000. Wenn jeder Eintrag eine echte Ausgabe repräsentiert, würde diese Umwandlung Daten entfernen und den Gesamtbetrag verfälschen.
Prüfen Sie doppelte Transaktionen anhand geeigneter stabiler Kennungen und einer ausdrücklich festgelegten Regel: Soll eine wiederholte Kennung abgewiesen oder ein vorhandener Datensatz aktualisiert werden? Ein Set kann bereits gesehene Kennungen speichern, entscheidet aber diese Regel nicht selbst. Ebenso ist das automatische Entfernen doppelter Eingaben kein Ersatz für die Meldung fehlerhafter Quelldaten.
Wenn Sie bei hashbaren Elementen nur Wiederholungen entfernen und die erste Auftretensreihenfolge behalten möchten, ist list(dict.fromkeys(items)) eine mögliche Form. Der resultierende Dictionary-Schlüsselbestand erhält die erste Reihenfolge; Wiederholungszahlen gehen trotzdem verloren. Die Referenz zu dict.fromkeys beschreibt die Erzeugung aus Schlüsseln. Auch hier brauchen alle Elemente geeignete Schlüsselwerte.
Fehlende Elemente und Änderungen gezielt testen
remove(value) löst bei einem fehlenden Element KeyError aus. discard(value) akzeptiert dessen Abwesenheit. Wenn ein Element vorhanden sein muss, kann der Fehler von remove eine verletzte Voraussetzung sichtbar machen. Für optionale Bereinigung ist discard oft passend.
- Fügen Sie
fooderneut zuusedhinzu, etwa mitused.add("food"). Die Menge soll weiterhin zwei Elemente enthalten. Eine weitere Wiederholung erzeugt keinen zusätzlichen Eintrag. - Fügen Sie anschließend
bookszuusedhinzu. Die sortierte Schnittmenge mitallowedmuss nun["books", "food"]enthalten, während die Differenz weiterhin nurtransportzeigt. - Ersetzen Sie im Originalcode
discard("missing")vorübergehend durchremove("missing"). Die ersten drei Ausgaben bleiben sichtbar; danach mussKeyErrorauftreten und die letzte Mitgliedschaftsausgabe entfällt. - Stellen Sie alle Ausgangswerte und den Aufruf von
discardwieder her. Vergleichen Sie erneut die vier ursprünglichen Ausgabezeilen.
Wählen Sie eine Liste, wenn Reihenfolge und Wiederholungen erhalten bleiben müssen, ein Tupel für einen kurzen positionalen Datensatz, ein Dictionary für Zuordnungen nach Schlüsseln und ein Set für Eindeutigkeit und Mitgliedschaft. Entscheidend ist, welche Information die Anwendung behalten soll, nicht allein die Kürze der Umwandlung.




