Level 3: Mengen #
Die richtige Datenstruktur für den Job #
Listen sind für Programmierer:innen übrigens sogenannte Datenstrukturen. Oft erledigt sich eine Aufgabe wie von selbst, wenn du nur die richtige Datenstruktur auswählst. Daher ist es gut, möglichst viele Datenstrukturen möglichst genau zu kennen – auch wenn du für eine Aufgabe nur eine Datenstruktur brauchst und vielleicht 90% deines Wissens verzichtbar gewesen wäre, wird dir die richtige Wahl viel Arbeit ersparen.
Eine Liste, in der jedes Element nur einmal vorkommen darf? Hat da bei Dir irgendetwas geklingelt? Mathematiker sagen zu so etwas auch Menge. Anstatt nun Listen mit einer Abfrage zu versehen, können wir auch eine Menge für eine solche Aufgabe verwenden. »Menge« heißt übrigens »Set« auf Englisch. Versuche einmal folgendes:
>>> einkauf = set()
>>> einkauf
set()
>>> einkauf.add('Butter')
>>> einkauf.add('Zucker')
>>> einkauf.add('Klopapier')
>>> einkauf
{'Butter', 'Zucker', 'Klopapier'}
>>> einkauf.add('Klopapier')
>>> einkauf
{'Butter', 'Zucker', 'Klopapier'}
Die Datenstruktur Menge kennt also add
(füge hinzu) statt append
(hänge an). Das wird der Sache auch gerecht, denn die Menge merkt sich nicht zwingend die Reihenfolge ihrer Elemente.
Da in Mengen sowieso keine doppelten Elemente erlaubt sind, können wir uns die komplizierte Prüfung sparen. Ist das Element schon enthalten, passiert nichts, ist es noch nicht in der Menge, wird es hinzugefügt.
Mit Mengen rechnen #
Übrigens kann man mit Mengen in Python (wie in der Mathematik) rechnen. Stell’ Dir vor, Du möchtest zusammen mit Deiner Freundin oder Deinem Freund Cookies backen. Ihr wisst, welche Zutaten Ihr braucht, Ihr habt beide schon etwas besorgt, und müsst jetzt schauen, was noch fehlt… auf in die REPL!
>>> rezept = {'Butter', 'Zucker', 'Backpulver', 'Vanillezucker', 'Mehl', 'Salz', 'Schokotropfen'}
>>> dein_einkauf = {'Zucker', 'Backpulver'}
>>> freund_in_einkauf = {'Butter', 'Mehl'}
>>> rezept - dein_einkauf - freund_in_einkauf
{'Vanillezucker', 'Salz', 'Schokotropfen'}
Eine Kurzschreibweise für Mengen
Du siehst, dass Du eine Menge (Set) auch erstellen kannst, indem Du ihre Elemente in geschweiften Klammern angibst. (Falls du diese Taste auf der Tastatur noch suchst: Alt Gr+7 und Alt Gr+0 oder Alt+8 und Alt+9 auf dem Mac.) Wenn Du allerdings eine leere Menge erstellen möchtest, musst Du nach wie vor
set()
schreiben –{}
erstellt nämlich ein so genanntes Dictionary – das werden wir uns später noch ansehen.
Ihr braucht also noch Vanillezucker, Salz (nur eine Prise) und Schokotropfen… das ist doch praktisch, oder?
Übung: der bessere Einkaufszettel #
Schreibe nun das Programm von vorhin um, so dass es Dinge für den Einkaufszettel entgegennimmt, ebenfalls keine Dopplungen erlaubt und nach Eingabe von “ende” eine schöne Liste ausgibt.
Der erste Schritt ist hier schon umgesetzt. Wenn du das Programm so laufen lässt, wird allerdings schnell eine Fehlermeldung angezeigt werden. Lies’ sie dir genau durch, und überlege dann, was du ändern musst!
einkaufsliste = set()
eingabe = input('Was soll auf den Einkaufszettel? (Tippe "ende", wenn Du fertig bist.) ')
while eingabe != 'ende':
if not eingabe in einkaufsliste:
einkaufsliste.append(eingabe)
eingabe = input('Was noch? ')
for einkauf in einkaufsliste:
print(einkauf)
Tipp 1
Du solltest eine Fehlermeldung bekommen, die so ähnlich wie diese hier aussieht:
einkaufsliste.append(eingabe)
AttributeError: 'set' object has no attribute 'append'
Einem set lässt sich nichts anhängen (append
) – die entsprechende Funktion eines set-Objektes hast du allerdings kennegelernt: add
Tipp 2
if not eingabe in einkaufsliste
ist nun nicht mehr notwendig, da das set ohnehin keine doppelten Elemente erlaubt. Die Zeile danach musst du dann allerdings wieder ausrücken.
Lösungsvorschlag
einkaufsliste = set()
eingabe = input('Was soll auf den Einkaufszettel? (Tippe "ende", wenn Du fertig bist.) ')
while eingabe != 'ende':
einkaufsliste.add(eingabe)
eingabe = input('Was noch? ')
for einkauf in einkaufsliste:
print(einkauf)
Refaktorisierung
Das Programm ist kürzer und damit besser lesbar geworden. Vielleicht lässt es sich so sogar noch leichter verstehen! Eine solche Arbeit an einem Programm heißt Refactoring oder auf auf deutsch Refaktorisierung. Dabei ändert sich nichts an der Funktion des Programms. Weitere Möglichkeiten der Refaktorisierung wirst du später noch kennenlernen.
Weiteres zu Mengen… #
… findest Du hier:
https://openbook.rheinwerk-verlag.de/python/15_002.html#u15.2