Python-Wörterbücher und Mengen
AnfängerEinheit 7 von 10 in Kurs: Python-Programmierung – Schleifen, Funktionen, Listen und Dateien
Was du lernst
- Erkläre, was ein Wörterbuch ist, erstelle eines aus Schlüssel-Wert-Paaren, lies Werte über Schlüssel, ohne dass das Programm bei fehlenden Schlüsseln abbricht, und füge Einträge hinzu, ändere und entferne sie.
- Wörterbücher aus Schlüssel-Wert-Paaren erstellenBeschreibe ein Wörterbuch als Sammlung, die eindeutige Schlüssel auf Werte abbildet, schreibe Wörterbuchliterale, erstelle Wörterbücher mit
dict()und wähle Schlüssel, die Python akzeptiert. - Werte sicher über Schlüssel nachschlagenLies einen Wert mit eckigen Klammern, prüfe mit
in, ob ein Schlüssel existiert, und gib mitget()einen Standardwert vor, statt bei einem fehlenden Schlüssel abzubrechen. - Einträge hinzufügen, ändern und entfernenFüge neue Einträge hinzu, aktualisiere vorhandene Werte, führe zwei Wörterbücher zusammen und lösche Einträge mit
del,pop()und verwandten Methoden.
- Wörterbücher aus Schlüssel-Wert-Paaren erstellen
- Durchlaufe jeden Schlüssel, Wert oder Eintrag eines Wörterbuchs, berechne Summen und erstelle sortierte Berichte sowie neue Wörterbücher mit Schleifen und Dictionary Comprehensions.
- Schlüssel, Werte und Einträge durchlaufenVerwende
for-Schleifen mit einem Wörterbuch,.values()und.items(), sortiere Schlüssel nach Namen oder Werten und vermeide es, die Größe eines Wörterbuchs während des Durchlaufens zu ändern. - Neue Wörterbücher aus vorhandenen Daten erstellenErstelle Wörterbücher mit Schleifen und Dictionary Comprehensions, um Werte umzuwandeln, Einträge zu filtern, Listen paarweise zu verbinden und Schlüssel mit Werten zu vertauschen.
- Schlüssel, Werte und Einträge durchlaufen
- Verwende ein Wörterbuch als Sammlung von Zählern, sammle Elemente in Gruppen und summiere Werte pro Kategorie. Das sind alltägliche Aufgaben von Wörterbüchern in echten Programmen.
- Häufigkeiten zählenErstelle eine Häufigkeitstabelle mit einem Wörterbuch aus Zählern, zähle Wörter in einem Text, finde die häufigsten Elemente und lerne
Counterals Abkürzung kennen. - Elemente gruppieren und Werte nach Kategorien summierenSammle Elemente unter einem gemeinsamen Schlüssel in Listen, summiere Beträge pro Kategorie, berechne arithmetische Mittel für Gruppen und vermeide Listen, die versehentlich von mehreren Schlüsseln referenziert werden.
- Häufigkeiten zählen
- Stelle Datensätze als Wörterbücher innerhalb von Wörterbüchern oder Listen dar, lies und aktualisiere Werte auf jeder Ebene und durchlaufe verschachtelte Daten, um sie zusammenzufassen.
- Datensätze in verschachtelten Wörterbüchern speichern und abrufenErstelle Wörterbücher aus Wörterbüchern, Listen aus Wörterbüchern und Wörterbücher aus Listen, greife mit verketteten Zugriffen auf Werte zu, aktualisiere sie und kopiere verschachtelte Daten sicher.
- Verschachtelte Daten durchlaufen und zusammenfassenVerwende Schleifen, auch verschachtelte, um Datensätze auszugeben, zu filtern und zusammenzufassen, und behandle Datensätze mit fehlenden Feldern oder leeren Listen.
- Datensätze in verschachtelten Wörterbüchern speichern und abrufen
- Erstelle Mengen eindeutiger Werte, prüfe die Zugehörigkeit, vergleiche Sammlungen mit Vereinigungsmenge, Schnittmenge und Differenzmenge und wähle zwischen Listen, Tupeln, Wörterbüchern und Mengen.
- Mengen erstellen und Duplikate entfernenSchreibe und verändere Mengen, erkläre, warum sie keine Duplikate und keine Reihenfolge haben, prüfe die Zugehörigkeit und entferne Duplikate aus einer Liste mit oder ohne Beibehaltung ihrer Reihenfolge.
- Sammlungen mit Mengenoperationen vergleichenVerwende Vereinigungsmenge, Schnittmenge, Differenzmenge und symmetrische Differenz, prüfe Teilmengen, Obermengen und disjunkte Mengen und unterscheide Operatoren, die neue Mengen zurückgeben, von Methoden, die eine Menge verändern.
- Die passende Sammlung für eine Aufgabe wählenVergleiche Listen, Tupel, Wörterbücher und Mengen, wähle die für eine Aufgabe passende Sammlung und kombiniere sie, auch mit Mengenoperationen auf Wörterbuchschlüsseln.
- Mengen erstellen und Duplikate entfernen
Python-Wörterbücher einfach erklärt
1Daten mit Wörterbüchern speichern und nachschlagen
Ein Wörterbuch verknüpft jeden Schlüssel mit einem Wert. So lassen sich Kontakte, Warenbestände und andere Datensätze über Namen nachschlagen. Um ein Wörterbuch zu erstellen und zu verändern, musst du zunächst wissen, was ein Schlüssel bezeichnet und was sein Wert bedeutet. Sicheres Nachschlagen ermöglicht es einem Programm dann, einen fehlenden Datensatz von einem vorhandenen Wert null zu unterscheiden. Beim Hinzufügen, Zusammenführen und Entfernen von Paaren ändern sich die gespeicherten Informationen nach vorhersehbaren Regeln für die Einfügereihenfolge.
1.1 Wörterbücher aus Schlüssel-Wert-Paaren erstellen
Ein Wörterbuch speichert Paare: Ein Schlüssel bezeichnet einen Eintrag, und sein Wert enthält die gesuchte Information. Eine Kontaktliste ist ein hilfreiches Modell: Ein Name führt zu einer Telefonnummer. Beim Nachschlagen in einem Wörterbuch wird ein Schlüssel verwendet, auch wenn dieser zufällig eine Zahl ist.
Paare schreiben
ages = {"Ana": 31, "Ben": 27, "Cara": 35}
print(ages["Ben"])
print(len(ages))
Dies gibt 27 und danach 3 aus. Der Doppelpunkt verbindet jeden Schlüssel mit seinem Wert; Kommas trennen die Paare. len zählt die Paare. Sowohl {} als auch dict() erzeugen ein leeres Wörterbuch.
Jeder Schlüssel kommt nur einmal vor. In {"a": 1, "b": 2, "a": 3} ersetzt der spätere Wert für "a" den früheren, sodass {'a': 3, 'b': 2} übrig bleibt. Zwei verschiedene Schlüssel dürfen denselben Wert haben: {"Ana": "blue", "Ben": "blue"} hat weiterhin zwei Einträge.
Aus anderen Daten erstellen
Wähle die Form, die zur Eingabe passt:
colors = dict(red=1, blue=2)
coordinates = dict([("x", 10), ("y", 20)])
labels = dict(zip(["a", "b", "c"], [1, 2, 3]))
Die erste Form macht aus den Argumentnamen Zeichenketten als Schlüssel. Die zweite liest eine Sequenz von Paaren mit je zwei Elementen. Die dritte verbindet entsprechende Elemente zweier Listen zu Paaren und erzeugt {'a': 1, 'b': 2, 'c': 3}. Die Zeichenketten in der ersten Form sind 'red' und 'blue'; es werden keine Variablen nachgeschlagen.
Verwendbare Schlüssel wählen
Wörterbuchschlüssel müssen hashbar sein. Zeichenketten und Zahlen funktionieren ebenso wie Tupel, die vollständig aus hashbaren Elementen bestehen. Listen, Wörterbücher und gewöhnliche Mengen funktionieren nicht als Schlüssel. Verwende für einen Ort das Tupel (2, 3) statt der Liste [2, 3]:
board = {(0, 0): "start", (2, 3): "treasure"}
print(board[(2, 3)])
Dies gibt treasure aus. Die runden Klammern machen das Koordinatenpaar zu einem Schlüssel. Ein Tupel, das eine Liste enthält, erfüllt die Hashbarkeitsregel dennoch nicht. Für Wörterbuchwerte gilt diese Einschränkung nicht: Ein Wert kann eine Liste, ein anderes Wörterbuch oder ein beliebiger anderer Datentyp sein.
Gleiche numerische Schlüssel beziehen sich auf denselben Eintrag. Da 1, 1.0 und True beim Vergleich gleich sind, enthält {1: "one", 1.0: "float one"} ein Paar mit dem Wert 'float one'. Die Zeichenkette "1" ist ein anderer Schlüssel als die Zahl 1.
Reihenfolge und Identität unterscheiden
Seit Python 3.7 bewahren Wörterbücher die Einfügereihenfolge. Die Altersangaben oben erscheinen bei der Ausgabe oder beim Durchlaufen in der Reihenfolge Ana, Ben, Cara. Sie haben weiterhin Schlüssel und keine Listenpositionen: ages[0] fragt den Schlüssel 0 ab und löst KeyError: 0 aus.
Wörterbücher sind veränderlich. Nach backup = ages verweisen beide Namen auf dasselbe Wörterbuch. Die Zuweisung backup["Ana"] = 32 ändert auch den Wert, auf den über ages zugegriffen wird. Um das äußere Wörterbuch zu kopieren, schreibe backup = ages.copy() oder backup = dict(ages). Separate äußere Wörterbücher können weiterhin verschachtelte Listen und Wörterbücher gemeinsam referenzieren.
Wichtige Erkenntnisse
- Jeder eindeutige Schlüssel ist einem Wert zugeordnet;
len(d)zählt die Paare. - Schlüssel müssen hashbar sein; Werte können jeden Datentyp haben.
- Gleiche Schlüssel gehören zum selben Eintrag; spätere Zuweisungen ersetzen dessen Wert.
- Die Einfügereihenfolge macht Wörterbuchschlüssel nicht zu Positionen.
- Bei einer Zuweisung wird das Wörterbuch gemeinsam referenziert;
copy()erstellt ein separates äußeres Wörterbuch.
1.2 Werte sicher über Schlüssel nachschlagen
Wie du einen Wert nachschlägst, sollte dazu passen, was ein fehlender Schlüssel in deinem Programm bedeutet. Manchmal weist er auf einen Fehler hin. Manchmal ist er normal, etwa bei einem Produkt, das noch nicht gezählt wurde. Python bietet dir verschiedene Möglichkeiten, diese Fälle zu behandeln.
Einen vorhandenen Wert lesen
stock = {"apples": 12, "pears": 0, "plums": 7}
print(stock["plums"])
Der Zugriff mit eckigen Klammern gibt 7 zurück. Schlüssel müssen genau übereinstimmen: "Plums" unterscheidet sich von "plums". Das Lesen von stock["kiwis"] löst KeyError: 'kiwis' aus, weil dieser Schlüssel fehlt. Es liefert weder einen leeren Wert noch den Zählwert null.
Verwende diesen direkten Zugriff, wenn ein Schlüssel erforderlich ist. Ein Fehler macht dann an der Stelle seines Auftretens auf unvollständige Daten oder einen Schreibfehler aufmerksam.
Auf einen Schlüssel prüfen
Der Ausdruck key in stock prüft, ob ein Schlüssel existiert. "pears" in stock ist True, obwohl der gespeicherte Wert null ist. "kiwis" not in stock ist ebenfalls True.
item = "kiwis"
if item in stock:
print(stock[item])
else:
print("No stock record for", item)
Hier führt der fehlende Schlüssel zu einer Meldung. Der Zugriff findet nur in dem Zweig statt, in dem der Schlüssel existiert.
Eine Zugehörigkeitsprüfung in einem Wörterbuch durchsucht die Schlüssel. 12 in stock ist False; um zu fragen, ob ein Eintrag den gespeicherten Wert 12 hat, schreibe 12 in stock.values(). Die Sammlung nach in bestimmt, was durchsucht wird.
Mit einem Standardwert lesen
stock.get("kiwis") gibt None zurück, ohne KeyError auszulösen. Gib ein zweites Argument an, um einen anderen Standardwert zu wählen: stock.get("kiwis", 0) ergibt 0. Keiner der beiden Aufrufe fügt einen neuen Eintrag ein. Nach beiden Aufrufen enthält das Wörterbuch weiterhin nur Äpfel, Birnen und Pflaumen.
| Frage des Programms | Nützliche Form |
|---|---|
| Welchen Wert hat dieser erforderliche Schlüssel? | stock[item] |
| Existiert dieser Schlüssel? | item in stock |
| Was ist der Wert oder ein Ersatzwert, falls der Schlüssel fehlt? | stock.get(item, 0) |
Der Standardwert ersetzt einen fehlenden Zugriff, keinen gespeicherten Wert. stock.get("pears", 99) gibt 0 zurück, weil für Birnen bereits ein Wert vorliegt.
Null nicht mit fehlend verwechseln
if stock.get("pears"): prüft den Wahrheitswert des zurückgegebenen Werts. Null gilt als falsch, daher wird dieser Zweig übersprungen. Derselbe Test überspringt auch einen fehlenden Schlüssel, dessen Zugriff None zurückgibt. Um diese Fälle zu unterscheiden, prüfe direkt, ob der Schlüssel enthalten ist.
Eine ganze Bestellung verarbeiten
prices = {"coffee": 3.5, "tea": 2.75}
order = ["tea", "coffee", "tea", "soda"]
total = 0
for item in order:
if item in prices:
total += prices[item]
else:
print("No price for", item)
print(total)
Der erste Tee erhöht die Summe auf 2,75, der Kaffee auf 6,25 und der zweite Tee auf 9,0. Für das Erfrischungsgetränk erscheint die Meldung No price for soda; es wird nichts addiert. Ein direkter Zugriff bei jedem Durchlauf würde beim Erfrischungsgetränk fehlschlagen; ein unbemerkt verwendeter Standardpreis von null würde den fehlenden Preis verbergen. Der separate Zweig macht diese fehlende Information sichtbar.
Wichtige Erkenntnisse
d[key]löstKeyErroraus, wenn der Schlüssel fehlt.inprüft Schlüssel, auch solche mit dem Wert null oder einem leeren Wert.getgibt einen Wert oder einen Standardwert zurück, ohne einen Schlüssel einzufügen.- Wähle einen Standardwert nur, wenn er für die Aufgabe sinnvoll ist.
1.3 Einträge hinzufügen, ändern und entfernen
Beim Aktualisieren eines Wörterbuchs bestimmen Schlüssel, was geändert wird. Die Zuweisung eines Werts kann ein neues Paar hinzufügen oder einen alten Wert ersetzen. Das Entfernen eines Paars kann außerdem eine benötigte Information zurückgeben, etwa die aus einem Warenbestand entnommene Menge.
Hinzufügen und ersetzen
scores = {"Ana": 8}
scores["Ben"] = 6
scores["Ana"] = 9
scores["Ben"] += 2
print(scores)
Das Ergebnis ist {'Ana': 9, 'Ben': 8}. Ben wird hinzugefügt, Anas Punktzahl wird aktualisiert und dann wird Bens vorhandene Punktzahl erhöht. Die Zeile mit += liest zuerst den alten Wert und löst daher bei einem fehlenden Schlüssel KeyError aus. Wörterbücher haben keine Methode append.
Wörterbücher verbinden
update kopiert Paare in ein vorhandenes Wörterbuch. Bei diesen Punktzahlen ändert scores.update({"Ben": 7, "Cara": 10}) Bens Wert auf 7 und fügt Cara mit 10 hinzu.
Seit Python 3.9 kann der Zusammenführungsoperator ein neues Wörterbuch erstellen:
left = {"x": 1, "y": 2}
right = {"y": 5, "z": 3}
merged = left | right
print(merged)
Dies gibt {'x': 1, 'y': 5, 'z': 3} aus. Bei einem gemeinsamen Schlüssel gilt der Wert von der rechten Seite. left bleibt unverändert; left |= right würde es direkt aktualisieren.
update() gibt None zurück. scores = scores.update(new_scores) verändert das alte Wörterbuch und lässt scores anschließend auf None verweisen. Rufe update in einer eigenen Zeile auf. Weise das Ergebnis von left | right zu, wenn du ein neues zusammengeführtes Wörterbuch möchtest.
Paare entfernen
| Operation | Wirkung und Rückgabewert |
|---|---|
del d[key] | Entfernt das Paar; ein fehlender Schlüssel löst KeyError aus. |
d.pop(key) | Entfernt das Paar und gibt seinen Wert zurück; ein fehlender Schlüssel löst KeyError aus. |
d.pop(key, 0) | Gibt 0 zurück, wenn der Schlüssel fehlt. |
d.popitem() | Entfernt das zuletzt eingefügte Paar und gibt es als Tupel zurück. |
d.clear() | Entfernt alle Paare und gibt None zurück. |
Für {"a": 1, "b": 2, "c": 3} gibt popitem() den Wert ('c', 3) zurück. Entscheidend ist die Einfügereihenfolge, nicht die alphabetische Reihenfolge oder der größte Wert.
Eine Bestandsänderung nachvollziehen
inventory = {"pens": 10, "pads": 4}
inventory["pens"] -= 3
inventory["clips"] = 50
removed = inventory.pop("pads")
Nach dem Verkauf bleiben 7 Stifte. Das Hinzufügen der Büroklammern erzeugt einen neuen Schlüssel. Das Entfernen der Blöcke speichert 4 in removed; übrig bleibt {'pens': 7, 'clips': 50}. Der Rückgabewert von pop ermöglicht dem Programm, die entfernte Menge zu verwenden, nachdem das Paar gelöscht wurde.
Nur bei fehlendem Schlüssel einfügen
setdefault(key, default) gibt den vorhandenen Wert zurück oder fügt den Standardwert ein und gibt ihn zurück, wenn der Schlüssel fehlt. Für stock = {"apples": 12, "pears": 0, "plums": 7} fügt stock.setdefault("kiwis", 0) Kiwis ein und gibt 0 zurück. stock.setdefault("apples", 99) gibt 12 zurück und lässt den Wert für Äpfel unverändert. Dieses Einfügen unterscheidet die Methode von get.
Beim Aktualisieren eines vorhandenen Schlüssels bleibt sein Platz unverändert. Ausgehend von {"a": 1, "b": 2, "c": 3} bleibt "a" nach d["a"] = 10 an erster Stelle. Löschst du "a" und fügst es erneut ein, steht es nach "c". Ein Ersatzwert und ein neu eingefügtes Paar wirken sich unterschiedlich auf die Reihenfolge aus.
Wichtige Erkenntnisse
d[key] = valuefügt einen Schlüssel hinzu oder ersetzt seinen Wert.- Beim Zusammenführen von Wörterbüchern gilt für einen gemeinsamen Schlüssel der rechte Wert.
popgibt einen entfernten Wert zurück;popitemgibt das zuletzt eingefügte Paar zurück.updateundcleargebenNonezurück.setdefaultfügt nur bei einem fehlenden Schlüssel einen Standardwert ein.- Beim Aktualisieren bleibt der Platz eines Schlüssels erhalten; Löschen und erneutes Einfügen verschiebt ihn ans Ende.
2Wörterbücher durchlaufen und neue erstellen
Schleifen machen aus einem Wörterbuch einen Bericht, eine Summe oder die Eingabe für eine neue Sammlung. Zunächst entscheidest du, was jeder Durchlauf benötigt: einen Schlüssel, einen Wert oder beide Teile eines Paars. Das Sortieren bestimmt die Reihenfolge eines Berichts, ohne das ursprüngliche Wörterbuch umzuordnen. Eine Comprehension kann eine kurze Regel zum Behalten oder Umwandeln von Paaren ausdrücken, während gewöhnliche Schleifen Platz für mehrere Verarbeitungsschritte und Prüfungen lassen.
2.1 Schlüssel, Werte und Einträge durchlaufen
Wähle eine Schleife, die dir den benötigten Teil jedes Paars liefert. Ein Wörterbuch allein liefert Schlüssel. Seine Ansichten können Werte oder ganze Paare liefern, sodass du Informationen nicht erst ermitteln musst, die dir die Schleife direkt geben kann.
Schlüssel, Werte oder Paare durchlaufen
temps = {"Mon": 68, "Tue": 75, "Wed": 71}
for day, temp in temps.items():
print(day, temp)
Die Temperaturen sind in Grad Fahrenheit angegeben. Dies gibt Mon 68, Tue 75 und Wed 71 in getrennten Zeilen und in Einfügereihenfolge aus. Jeder Eintrag ist ein Tupel mit zwei Elementen, das die Schleife in day und temp entpackt.
| Eingabe der Schleife | Was jeder Durchlauf erhält |
|---|---|
temps oder temps.keys() | Einen Tag als Schlüssel |
temps.values() | Einen Temperaturwert |
temps.items() | Ein (day, temperature)-Paar |
Bei for day in temps: verwendest du innerhalb der Schleife temps[day], wenn du den zugehörigen Wert brauchst. Benötigt das Programm jedes Mal beide Teile, macht .items() die Aufgabe meist deutlicher.
Ansichten verstehen
keys(), values() und items() geben Ansichten zurück, die spätere Änderungen an ihrem Wörterbuch widerspiegeln. Sie sind keine Listen und erlauben keinen Zugriff über Positionsindizes. temps.keys()[0] löst TypeError aus. Wandle die Ansicht in eine Liste um, wenn du eine Momentaufnahme mit Positionen brauchst: list(temps) ergibt ['Mon', 'Tue', 'Wed'].
Eine Summe berechnen oder einen zugehörigen Schlüssel finden
sum(temps.values()) gibt 214 zurück, und die Division durch len(temps) ergibt ein arithmetisches Mittel von etwa 71,33. max(temps.values()) gibt 75 zurück. Um den Tag mit diesem Wert zu finden, schreibe max(temps, key=temps.get). Das ergibt 'Tue'.
Das Argument key= gibt eine Funktion vor, die für den Vergleich verwendet wird. Hier durchläuft Python die Tagesschlüssel und ruft für jeden temps.get auf, um die zugehörige Temperatur zu erhalten. Schreibe den Funktionsnamen, ohne die Funktion aufzurufen: temps.get, nicht temps.get(). Bei gleichen Werten gibt max den zuerst gefundenen Schlüssel zurück.
Einen Bericht sortieren
sorted(temps) gibt Schlüssel in alphabetischer Reihenfolge zurück. sorted(temps.items()) gibt nach Schlüsseln sortierte Paare zurück. Um Tagesschlüssel nach Temperatur zu sortieren, verwende sorted(temps, key=temps.get). Das ergibt ['Mon', 'Wed', 'Tue']. Ergänze reverse=True für ['Tue', 'Wed', 'Mon']. Diese Aufrufe geben Listen zurück; sie ordnen temps nicht um.
grades = {"Ana": 88, "Ben": 72, "Cara": 95}
passing = 0
for name, grade in grades.items():
print(f"{name}: {grade}")
if grade >= 75:
passing += 1
Der Bericht gibt jeden Namen mit der zugehörigen Punktzahl aus. Ana und Cara erreichen den Schwellenwert, also ist passing am Ende gleich 2.
Einträge entfernen, ohne den Durchlauf zu stören
Füge keine Schlüssel hinzu und lösche keine, während du ein Wörterbuch direkt durchläufst. Eine Änderung seiner Größe kann RuntimeError: dictionary changed size during iteration auslösen. Einen vorhandenen Wert zu ersetzen ist erlaubt.
Um kühlere Tage zu entfernen, verwende for day in list(temps): und lösche temps[day], wenn der Wert unter 70 liegt. Die Schleife durchläuft eine separate Liste von Schlüsseln; im Wörterbuch bleibt {'Tue': 75, 'Wed': 71} übrig. Ein neues gefiltertes Wörterbuch zu erstellen ist eine weitere Möglichkeit, den Durchlauf von den Änderungen zu trennen.
Wichtige Erkenntnisse
- Durchlaufe ein Wörterbuch für Schlüssel,
.values()für Werte oder.items()für Paare. - Ansichten spiegeln Änderungen wider; Listen ermöglichen den Zugriff über Positionen.
key=d.getvergleicht gespeicherte Werte, während Schlüssel zurückgegeben oder sortiert werden.- Das Sortieren gibt eine Liste zurück und lässt die Reihenfolge im Wörterbuch unverändert.
- Durchlaufe eine kopierte Schlüsselliste, wenn du Einträge löschst.
2.2 Neue Wörterbücher aus vorhandenen Daten erstellen
Ein neues Wörterbuch entsteht oft durch eine Regel, die auf vorhandene Daten angewendet wird. Beginne mit einer Schleife, die du erklären kannst, und verwende dann eine Comprehension, wenn dieselbe Regel klar in einen Ausdruck passt.
Ein Paar nach dem anderen erstellen
words = ["kiwi", "fig", "banana"]
lengths = {}
for word in words:
lengths[word] = len(word)
Jeder Durchlauf wählt ein Wort als Schlüssel und seine Länge als Wert. Das Ergebnis ist {'kiwi': 4, 'fig': 3, 'banana': 6}. Das Wörterbuch wird vor der Schleife erstellt, damit frühere Paare bei späteren Durchläufen erhalten bleiben.
Eine Dictionary Comprehension drückt dieselbe Arbeit aus:
lengths = {word: len(word) for word in words}
Lies den for-Teil, um zu sehen, was durchlaufen wird, und dann den Ausdruck davor, um zu sehen, welches Paar entsteht. Der Doppelpunkt trennt den Schlüsselausdruck vom Wertausdruck. Ohne diesen Doppelpunkt erstellt {word for word in words} eine Menge.
Bestimmte Einträge behalten
Eine if-Klausel filtert die Eingabe:
grades = {"Ana": 88, "Ben": 72, "Cara": 95}
high_grades = {
name: grade
for name, grade in grades.items()
if grade >= 80
}
Ana und Cara erfüllen die Bedingung. Das ergibt {'Ana': 88, 'Cara': 95}. Bens Paar wird weggelassen. Das Eingabewörterbuch bleibt unverändert; das Ergebnis enthält nur Paare, die die Bedingung erfüllen.
Werte umwandeln
Eine Comprehension kann die Tage beibehalten und zugleich Fahrenheit-Messwerte in Celsius umrechnen:
temps = {"Mon": 68, "Tue": 75, "Wed": 71}
celsius = {
day: round((f - 32) * 5 / 9, 1)
for day, f in temps.items()
}
Das Ergebnis ist {'Mon': 20.0, 'Tue': 23.9, 'Wed': 21.7}. Für Dienstag ergibt die Subtraktion von 32 den Wert 43; die Multiplikation mit 5 und die Division durch 9 ergeben etwa 23,89. round(..., 1) speichert 23,9. Der Schlüssel bleibt gleich, während sich der Wert ändert.
Listen sorgfältig paaren
dict(zip(names, scores)) verbindet jeden Namen mit der Punktzahl an derselben Position. zip endet, wenn die kürzere Eingabe endet. Die Verbindung von ["Ana", "Ben", "Cara"] mit [90, 85] ergibt {'Ana': 90, 'Ben': 85}. Keine Fehlermeldung weist auf Caras fehlende Punktzahl hin. Prüfe daher die Länge der Eingaben, wenn jeder Name eine Punktzahl haben muss.
Schlüssel und Werte vertauschen
favorites = {"Ana": "blue", "Ben": "red", "Cara": "blue"}
by_color = {color: name for name, color in favorites.items()}
Das Ergebnis ist {'blue': 'Cara', 'red': 'Ben'}. Ana und Cara bräuchten beide denselben neuen Schlüssel, daher ersetzt Caras späteres Paar das von Ana. Das Umkehren erhält nur dann alle Paare, wenn die alten Werte eindeutig und hashbar sind. Ein Listenwert kann überhaupt kein Wörterbuchschlüssel werden. Um mehrere Namen unter einer Farbe zu behalten, speichere unter dieser Farbe eine Liste von Namen.
Verwende eine gewöhnliche Schleife, wenn die Aufgabe mehrere Anweisungen, Meldungen oder Prüfungen benötigt. Eine Comprehension ist nützlich, weil sie eine kurze Regel sichtbar macht; zwängst du einen größeren Ablauf hinein, wird die Regel schwerer nachvollziehbar.
Wichtige Erkenntnisse
- Eine Dictionary Comprehension erzeugt für jede ausgewählte Eingabe ein Schlüssel-Wert-Paar.
- Eine
if-Klausel filtert; die Ausdrücke für das Paar können die Daten umwandeln. zipendet bei der kürzeren Eingabe.- Beim Umkehren eines Wörterbuchs können Einträge verloren gehen, wenn sich Werte wiederholen.
3Daten mit Wörterbüchern zählen und gruppieren
Wörterbücher können Ergebnisse sammeln, während eine Schleife Daten verarbeitet. Ein Zähler speichert eine Zahl pro unterschiedlichem Element; ein Gruppierungswörterbuch speichert mehrere Mitglieder unter jeder Kategorie. Beide Muster müssen das erste Auftreten eines Schlüssels behandeln und bewahren, was frühere Durchläufe angesammelt haben. Sobald die Gruppen existieren, lassen sich aus ihren Listen Summen und arithmetische Mittel berechnen. Hilfsmittel der Standardbibliothek können die Initialisierung verkürzen.
3.1 Häufigkeiten zählen
Eine Häufigkeitstabelle beantwortet, wie oft jedes unterschiedliche Element vorkommt. Ihre Schlüssel bezeichnen die Elemente; ihre Werte sind Zähler. Das Wörterbuch wächst, wenn ein neues Element erscheint, während spätere Vorkommen einen vorhandenen Zählwert erhöhen.
Einen Zähler nachvollziehen
counts = {}
for letter in "banana":
if letter in counts:
counts[letter] += 1
else:
counts[letter] = 1
Der erste Buchstabe erzeugt 'b': 1. Der nächste erzeugt 'a': 1 und dann folgt 'n': 1. Das nächste "a" erhöht seinen vorhandenen Zählwert auf 2. Nach den letzten beiden Buchstaben ist das Wörterbuch {'b': 1, 'a': 3, 'n': 2}. Seine Reihenfolge hält fest, wann jeder Buchstabe zuerst auftrat, nicht welcher Buchstabe am häufigsten ist.
Vor dem ersten Auftreten null verwenden
Die beiden Zweige können zu einer Zuweisung werden:
counts = {}
for letter in "banana":
counts[letter] = counts.get(letter, 0) + 1
Die rechte Seite liest den bisherigen Zählwert, verwendet bei einem fehlenden Schlüssel null und addiert dann eins. Die linke Seite speichert den neuen Zählwert. get selbst fügt nichts ein; das erledigt die Zuweisung.
Wird nur counts[letter] += 1 verwendet, schlägt dies bei einem neuen Buchstaben fehl. Verschiebst du counts = {} in die Schleife, entsteht ein anderes Problem: Jeder Durchlauf löscht die bisherigen Zählwerte. Initialisiere das Wörterbuch einmal vor der Verarbeitung der Elemente.
Entscheiden, was als dasselbe Wort zählt
Bei Text beeinflussen Groß- und Kleinschreibung sowie Satzzeichen die Schlüssel. Die Zeichenketten "The" und "the" unterscheiden sich ebenso wie "dog." und "dog". Bereinige die Formen, bevor du sie als Schlüssel verwendest:
text = "The cat saw the dog. The dog ran."
counts = {}
for word in text.lower().split():
word = word.strip(".,!?")
counts[word] = counts.get(word, 0) + 1
Dies ergibt {'the': 3, 'cat': 1, 'saw': 1, 'dog': 2, 'ran': 1}. lower vereinheitlicht die Groß- und Kleinschreibung, split trennt Wörter an Leerraumzeichen und strip entfernt die aufgeführten Satzzeichen an den Rändern. Satzzeichen innerhalb eines Wortes entfernt die Methode nicht.
Die häufigsten Elemente finden
Für diese nicht leere Tabelle gibt max(counts, key=counts.get) den Wert 'the' zurück. Um die zwei häufigsten Wörter zu finden, verwende sorted(counts, key=counts.get, reverse=True)[:2]. Das ergibt ['the', 'dog']. Gleiche Zählwerte behalten beim Sortieren ihre ursprüngliche Reihenfolge.
Das Muster zählt auch Zahlen oder Tupel. Für die Würfelergebnisse [3, 6, 3, 1, 6, 3] erstellt es {3: 3, 6: 2, 1: 1}. Ein nie beobachteter Wert hat keinen Eintrag. Lies ihn mit dem Standardwert null, wenn das nützlich ist.
Die Abkürzung aus der Bibliothek kennenlernen
from collections import Counter
letter_counts = Counter("banana")
print(letter_counts.most_common(1))
print(letter_counts["z"])
Dies gibt [('a', 3)] und danach 0 aus. Der Import macht Counter aus Pythons Standardbibliothek verfügbar. Ein Counter ist ein Wörterbuch, das zum Zählen bestimmt ist: Seine Schlüssel sind hashbare Elemente, und der direkte Zugriff auf ein fehlendes Element gibt null zurück. Die angezeigten Zählwerte für diese Eingabe sind Counter({'a': 3, 'n': 2, 'b': 1}).
Wichtige Erkenntnisse
- Eine Häufigkeitstabelle ordnet jedem unterschiedlichen Element seinen Zählwert zu.
- Initialisiere das Wörterbuch vor der Schleife.
counts[item] = counts.get(item, 0) + 1behandelt neue und wiederholte Elemente.- Bereinige Wörter vor dem Zählen, wenn Groß- und Kleinschreibung sowie Satzzeichen keine Rolle spielen sollen.
- Vergleiche Zählwerte mit
key=counts.get, um Elemente nach Häufigkeit zu ordnen. Countererstellt Zählwerte und gibt beim Zugriff auf fehlende Schlüssel null zurück.
3.2 Elemente gruppieren und Werte nach Kategorien summieren
Ein Wörterbuch kann unter jedem Schlüssel eine ganze Gruppe speichern. Der Schlüssel benennt die Kategorie, und eine Liste enthält die ihr zugeordneten Elemente. So bleibt jedes Mitglied für spätere Summen, arithmetische Mittel oder Berichte verfügbar.
Separate Listen für Gruppen erstellen
words = ["apple", "bean", "avocado", "beet", "corn"]
groups = {}
for word in words:
first = word[0]
if first not in groups:
groups[first] = []
groups[first].append(word)
Für "apple" erstellt das Programm unter "a" eine leere Liste und hängt das Wort an. "bean" beginnt eine separate Liste unter "b". "avocado" wird der vorhandenen Liste unter "a" hinzugefügt. Das Ergebnis ist {'a': ['apple', 'avocado'], 'b': ['bean', 'beet'], 'c': ['corn']}.
Die leere Liste wird nur für eine neue Bezeichnung erstellt. Würde sie bei jedem Durchlauf erstellt, gingen die bisherigen Mitglieder dieser Gruppe verloren.
Die Initialisierung verkürzen
groups.setdefault(word[0], []).append(word) führt denselben Gruppierungsschritt aus. setdefault gibt die vorhandene Liste zurück, falls es eine gibt. Andernfalls speichert es die angegebene leere Liste und gibt sie zurück. Das folgende append verändert diese zurückgegebene Liste.
Eine andere Möglichkeit erstellt Listen automatisch:
from collections import defaultdict
groups = defaultdict(list)
for word in words:
groups[word[0]].append(word)
Übergib list, die Funktion zum Erstellen einer neuen Liste, ohne Klammern. Beim Zugriff auf einen fehlenden Schlüssel erstellt und speichert dieses defaultdict eine neue leere Liste. Selbst ein lesender Zugriff wie groups["z"] fügt diesen fehlenden Schlüssel ein. Verwende "z" in groups, wenn du nur prüfen möchtest, ob eine Gruppe existiert.
Die Listen unabhängig halten
groups = dict.fromkeys(["a", "b"], []) legt dieselbe Liste unter beiden Schlüsseln ab. Das Anhängen von 1 über groups["a"] ergibt dann {'a': [1], 'b': [1]}. Beide Schlüssel referenzieren dieselbe Liste; sie wird nicht kopiert.
Um mit separaten Listen zu beginnen, verwende {key: [] for key in keys}, setdefault mit einer neuen [] oder defaultdict(list). Jede neue Kategorie muss ein eigenes Listenobjekt erhalten.
Beträge pro Kategorie addieren
Beim Zählen wird pro Vorkommen eins addiert. Eine Kategoriesumme addiert den Betrag jedes Elements:
expenses = [("food", 12.5), ("travel", 30),
("food", 7.25), ("books", 18)]
totals = {}
for category, amount in expenses:
totals[category] = totals.get(category, 0) + amount
Lebensmittel beginnen bei 12,5; dann kommen 7,25 hinzu, sodass sich 19,75 ergeben. Für Reisen beträgt die Summe 30 und für Bücher 18. Würde nur amount gespeichert, ersetzte das die vorherige Summe, statt den Betrag zu addieren.
Das arithmetische Mittel einer Gruppe berechnen oder Duplikate entfernen
Für scores = {"A": [80, 90], "B": [70]} durchlaufe scores.items() und berechne sum(values) / len(values). Das arithmetische Mittel von Gruppe A ist 85,0, das von Gruppe B 70,0. Prüfe vor der Division if values:, damit eine leere Gruppe gesondert behandelt wird.
Sollen Wiederholungen innerhalb jeder Gruppe verschwinden, verwende Mengen als Werte. tags.setdefault(post, set()).add(tag) erstellt eine Menge für einen neuen Beitrag und fügt dessen Markierung hinzu. Eine wiederholte Markierung bleibt ein Element; eine Liste würde jedes Vorkommen behalten.
Wichtige Erkenntnisse
- Beim Gruppieren wird eine Kategorie ihren Mitgliedern zugeordnet, oft in einer Liste.
- Erstelle für jede Gruppe eine neue Liste.
setdefaultunddefaultdict(list)vereinfachen die Initialisierung von Gruppen.- Kategoriesummen addieren Beträge; für das arithmetische Mittel wird die Summe jeder Gruppe durch ihre eigene Anzahl geteilt.
- Verwende Mengen als Gruppenwerte, wenn wiederholte Mitglieder verschwinden sollen.
4Strukturierte Daten mit verschachtelten Wörterbüchern modellieren
Zusammengehörige Felder bilden einen Datensatz. Mehrere Datensätze können über eine ID organisiert oder als Zeilen in einer Liste gespeichert werden. Um auf den richtigen Wert zuzugreifen, durchläufst du die Ebenen nacheinander. Berichte kombinieren dann eine äußere Schleife über die Datensätze mit Feldzugriffen oder einer inneren Schleife über eine gespeicherte Liste. Fehlende optionale Felder, leere Listen und gemeinsam referenzierte innere Objekte wirken sich jeweils darauf aus, wie diese Datensätze gelesen, zusammengefasst oder kopiert werden sollten.
4.1 Datensätze in verschachtelten Wörterbüchern speichern und abrufen
Ein Datensatz fasst zusammengehörige Felder zusammen, etwa Alter, Studienfach und Noten eines Studierenden. Ein verschachteltes Wörterbuch speichert ein anderes Wörterbuch als Wert. Die äußeren Schlüssel können Datensätze bezeichnen, während die inneren Schlüssel Felder bezeichnen.
Eine Ebene nach der anderen lesen
students = {
"ana": {"age": 19, "major": "math", "grades": [88, 92]},
"ben": {"age": 22, "major": "history", "grades": [75, 81, 79]},
}
students["ana"] liefert Anas Datensatz als Wörterbuch. Ergänzt du ["major"], wird das Studienfach daraus gelesen. students["ana"]["major"] gibt also 'math' zurück. Für Bens neueste Note gelangt students["ben"]["grades"][-1] zum Datensatz, dann zu dessen Liste und schließlich zum letzten Listenelement 79.
Jeder Zugriff wirkt auf das Objekt, das der vorherige Zugriff zurückgegeben hat. Dieselbe Schreibweise mit eckigen Klammern kann auf einer Ebene einen Wörterbuchschlüssel und auf einer anderen eine Listenposition bezeichnen.
Ein Feld ändern oder einen Datensatz hinzufügen
students["ana"]["age"] = 20
students["ben"]["email"] = "ben@example.com"
students["cara"] = {"age": 21, "major": "art", "grades": []}
students["cara"]["grades"].append(90)
Die ersten beiden Zeilen ändern Felder in vorhandenen Datensätzen oder fügen welche hinzu. Die dritte fügt einen ganzen Datensatz unter einer neuen ID hinzu. Die vierte greift auf Caras Notenliste zu und hängt eine Punktzahl an.
Die Zuweisung students["dev"]["age"] = 30 schlägt fehl, weil der äußere Zugriff auf "dev" zuerst erfolgt und KeyError: 'dev' auslöst. Erstelle den Datensatz, bevor du seinen Feldern Werte zuweist.
Für einen optionalen Zugriff gibt students.get("dev", {}).get("age") den Wert None zurück. Der erste Standardwert ist ein leeres Wörterbuch, sodass das zweite get ein Wörterbuch zum Lesen erhält, auch wenn der Datensatz fehlt. Bei diesen Datensätzen ist jeder äußere Wert selbst ein Wörterbuch.
Eine zum Zugriff passende Struktur wählen
Eine Liste von Wörterbüchern bewahrt die Reihenfolge der Zeilen:
rows = [{"name": "Ana", "city": "Austin"},
{"name": "Ben", "city": "Denver"}]
print(rows[1]["city"])
Dies gibt Denver aus: zuerst der Listenindex, dann der Feldschlüssel. Ein Wörterbuch von Listen wie {"A": [80, 90], "B": [70]} speichert mehrere Werte pro Bezeichnung. Diese Strukturen lassen sich kombinieren, wenn ein Datensatz sowohl benannte Felder als auch eine geordnete Liste benötigt.
Wenn Namen Zeilen eindeutig bezeichnen, erstelle by_name = {row["name"]: row for row in rows}. Dann findet by_name["Ben"] Bens Zeile direkt. Die Werte sind die vorhandenen Zeilenwörterbücher, sodass Änderungen über diesen Index auch diese Zeilen betreffen. Wiederholen sich Namen, ersetzt eine spätere Zeile eine frühere unter demselben Schlüssel.
Verschachtelte Daten bewusst kopieren
backup = students referenziert dasselbe Wörterbuch. backup = students.copy() erstellt ein separates äußeres Wörterbuch, behält aber dieselben inneren Datensätze bei. Nach dieser flachen Kopie ändert backup["ana"]["age"] = 99 auch Anas Alter in students.
import copy
independent = copy.deepcopy(students)
independent["ana"]["age"] = 25
Bei diesen verschachtelten Wörterbüchern und Listen erstellt die tiefe Kopie auch separate innere Objekte. Eine Änderung des kopierten Alters lässt das ursprüngliche Alter unverändert. Verwende einheitliche Feldnamen in allen Datensätzen, damit derselbe Zugriffscode für jeden Datensatz funktioniert.
Wichtige Erkenntnisse
- Verkettete Zugriffe durchlaufen jeweils eine Sammlung nach der anderen.
- Erstelle ein inneres Wörterbuch, bevor du einem Feld darin einen Wert zuweist.
- Eine Liste von Datensätzen verwendet zuerst einen Index; ein Wörterbuch von Datensätzen verwendet eine ID.
- Eine flache Kopie referenziert dieselben inneren Datensätze; eine tiefe Kopie trennt verschachtelte veränderliche Daten.
4.2 Verschachtelte Daten durchlaufen und zusammenfassen
Beim Verarbeiten verschachtelter Daten musst du im Blick behalten, welche Ebene die Schleife erreicht hat. Eine äußere Schleife wählt einen Datensatz. Ein Feldzugriff erreicht einen Wert innerhalb dieses Datensatzes, und eine innere Schleife kann dann die Elemente einer gespeicherten Liste durchlaufen.
Pro Durchlauf einen Datensatz zusammenfassen
students = {
"ana": {"major": "math", "grades": [88, 92]},
"ben": {"major": "history", "grades": [75, 81, 79]},
"cara": {"major": "art", "grades": []},
}
for name, info in students.items():
grades = info["grades"]
major = info["major"]
if grades:
average = sum(grades) / len(grades)
print(f"{name}: {major}, average {average:.1f}")
else:
print(f"{name}: {major}, no grades")
Anas Punktzahlen ergeben zusammen 180, also beträgt ihr arithmetisches Mittel 90,0. Bens drei Punktzahlen ergeben zusammen 235 und damit etwa 78,33 im Mittel; das Format :.1f zeigt 78,3 an. Caras Liste ist leer, daher gibt das Programm cara: art, no grades aus, ohne durch null zu dividieren.
Die Zuweisung von grades und major innerhalb der Schleife gibt jedem Namen die Werte des aktuellen Datensatzes. Auch das arithmetische Mittel gehört in die Schleife: Es muss für jeden Studierenden separat berechnet werden.
Optionale Felder lesen
info.get("email", "no email") liefert einen Text für ein optionales E-Mail-Feld. Ein direkter Zugriff mit info["email"] würde bei einem Datensatz ohne dieses Feld KeyError auslösen. Ein Standardwert gehört auf die Ebene, auf der das Feld fehlen kann. get auf dem äußeren Wörterbuch würde nach Studierenden-IDs suchen, nicht nach E-Mail-Feldern.
Datensätze auswählen
math_students = []
for name, info in students.items():
if info["major"] == "math":
math_students.append(name)
Dies ergibt ['ana']. Die Bedingung liest ein Feld des aktuellen Datensatzes; der angehängte Wert ist der äußere Schlüssel. Benötigte der Bericht ganze Datensätze, könnte er stattdessen info anhängen. Entscheide, welche Art von Ergebnis der nächste Programmteil benötigt.
Jede gespeicherte Punktzahl durchlaufen
count = 0
for info in students.values():
for grade in info["grades"]:
if grade > 80:
count += 1
Die innere Schleife durchläuft Anas 88 und 92, dann Bens 75, 81 und 79. Caras leere Liste führt zu keinem weiteren Durchlauf. Drei Punktzahlen liegen über 80: 88, 92 und 81. Der Zähler wird außerhalb beider Schleifen initialisiert, weil er alle Studierenden zusammen erfasst. Würde er innerhalb der äußeren Schleife zurückgesetzt, bliebe nur der Zählwert des letzten Datensatzes erhalten.
Datensätze nach einem Feld zählen
majors = {}
for info in students.values():
major = info["major"]
majors[major] = majors.get(major, 0) + 1
Jeder Datensatz erhöht den Zählwert seines Studienfachs um eins. Für Ana und Ben allein ist das Ergebnis {'math': 1, 'history': 1}; mit Cara kommt 'art': 1 hinzu. Um ein anderes Feld zu summieren oder zu gruppieren, behalte die äußere Schleife über die Datensätze bei und ändere den Wert, den sie beiträgt.
Gib für lesbare Berichte pro Datensatz eine formatierte Zeile aus statt des gesamten verschachtelten Wörterbuchs. Speichere in einem f-String ein Feld zunächst wie oben in einer Variablen oder verwende innerhalb der geschweiften Klammern die andere Art von Anführungszeichen, wie in f"{name}: {info['major']}".
Wichtige Erkenntnisse
- Eine äußere Schleife wählt einen Datensatz; Feldzugriffe arbeiten innerhalb dieses Datensatzes.
- Prüfe vor der Division durch die Länge, ob die Liste leer ist.
- Verwende
getauf dem Datensatz für ein optionales Feld. - Eine innere Schleife durchläuft jedes Element in der Liste eines Datensatzes.
- Setze einen Akkumulator außerhalb der Schleifen, deren Ergebnisse er zusammenfasst.
5Mengen verwenden, um Duplikate zu entfernen und Sammlungen zu vergleichen
Bei Mengen steht im Vordergrund, welche Werte vorhanden sind. Das Entfernen von Duplikaten und der Vergleich der Zugehörigkeit werden zu direkten Operationen, vom Finden gemeinsamer Kursteilnahmen bis zur Prüfung fehlender Fähigkeiten. Für Reihenfolge und wiederholte Vorkommen eignen sich andere Sammlungen, daher ist die Wahl vor der Umwandlung von Daten wichtig. Mengen führen auch zurück zu Wörterbüchern: Deren Schlüssel lassen sich als Mengen vergleichen, selbst wenn sich die gespeicherten Werte unterscheiden.
5.1 Mengen erstellen und Duplikate entfernen
Eine Menge hält fest, welche unterschiedlichen Werte vorhanden sind. Sie enthält jedes Element einmal und hat keine garantierte Reihenfolge. Mengen eignen sich für Zugehörigkeitsprüfungen und zum Entfernen von Duplikaten, wenn die Anzahl der Vorkommen keine Rolle spielt.
Eine Menge erstellen
colors = {"red", "green"}
numbers = set([3, 1, 3, 2, 1])
print(len(numbers))
print(sorted(numbers))
Dies gibt 3 und danach [1, 2, 3] aus. Wiederholte Eingaben werden zu einem einzigen Element. Eine leere Menge ist set(); {} erzeugt ein leeres Wörterbuch.
set("banana") durchläuft die Zeichen der Zeichenkette und lässt die unterschiedlichen Buchstaben "a", "b" und "n" übrig. {"banana"} übergibt die ganze Zeichenkette als ein Element. Wie bei Wörterbuchschlüsseln zählen gleiche numerische Werte nur einmal: {1, 1.0, True} hat ein Element.
Elemente müssen hashbar sein. Zahlen, Zeichenketten und Tupel aus hashbaren Werten funktionieren; Listen, Wörterbücher und gewöhnliche Mengen nicht. Verwende für ein Koordinatenelement (1, 2) statt [1, 2]. Ein frozenset ist eine unveränderliche Menge und kann selbst ein Mengenelement oder Wörterbuchschlüssel sein.
Ohne Positionen arbeiten
colors[0] löst TypeError aus, weil eine Menge keine Positionen hat. Ihre Ausgabereihenfolge ist nicht garantiert, und Zeichenkettenelemente können bei einem anderen Programmlauf in anderer Reihenfolge erscheinen. sorted(colors) erzeugt eine neue sortierte Liste, wenn die Elemente vergleichbar sind. Die Menge selbst erhält dadurch keine Reihenfolge.
Elemente verändern
| Operation | Was geschieht |
|---|---|
s.add(x) | Fügt ein Element hinzu; ein Duplikat hat keine Wirkung. |
s.update(items) | Fügt Elemente aus einem iterierbaren Objekt hinzu. |
s.remove(x) | Entfernt x; ein fehlendes Element löst KeyError aus. |
s.discard(x) | Entfernt x, falls vorhanden; ein fehlendes Element ist erlaubt. |
s.pop() | Entfernt ein beliebiges Element und gibt es zurück. |
s.clear() | Entfernt alle Elemente. |
add("blue") fügt eine Zeichenkette hinzu. update(["blue", "gold"]) fügt zwei Zeichenketten hinzu. update("blue") fügt dagegen einzelne Zeichen hinzu, weil eine Zeichenkette iterierbar ist. Mengen haben keine Methode append.
Bei Bedarf die Reihenfolge des ersten Auftretens bewahren
list(set(items)) entfernt Duplikate, verliert aber ihre ursprüngliche Reihenfolge. Ist die Reihenfolge des ersten Auftretens wichtig, nutze die Einfügereihenfolge eines Wörterbuchs:
items = [3, 1, 3, 2, 1]
unique = list(dict.fromkeys(items))
print(unique)
Dies gibt [3, 1, 2] aus. Die Werte werden zu Wörterbuchschlüsseln, sodass jeder einmal in der Reihenfolge seines ersten Auftretens erscheint.
Du kannst die Aufgaben auch ausdrücklich trennen:
seen = set()
unique = []
for item in items:
if item not in seen:
seen.add(item)
unique.append(item)
Die Menge beantwortet, ob ein Element bereits aufgetreten ist; die Liste bewahrt die Reihenfolge des ersten Auftretens. Beide Formen setzen hashbare Eingabeelemente voraus.
Unterschiedliche Elemente zählen oder Zugehörigkeit prüfen
Für die acht Wörter in "the cat saw the dog the dog ran".split() ist len(set(words)) gleich 5: the, cat, saw, dog und ran. Das zählt unterschiedliche Wörter, nicht ihre Häufigkeiten.
Mit einer Menge blockierter Absender beantwortet sender in blocked, ob eine Adresse enthalten ist. Bei großen Sammlungen ist die Zugehörigkeitsprüfung in Mengen und Wörterbüchern üblicherweise viel schneller als das einzelne Durchsuchen einer Liste.
Wichtige Erkenntnisse
- Eine Menge speichert eindeutige hashbare Elemente ohne garantierte Reihenfolge.
- Verwende
set()für eine leere Menge;{}ist ein Wörterbuch. removelöst bei einem fehlenden Element einen Fehler aus;discarderlaubt es.sorted(s)gibt eine Liste zurück; Mengenelemente haben keine Positionen.list(dict.fromkeys(items))entfernt Wiederholungen und bewahrt die Reihenfolge des ersten Auftretens.len(set(items))zählt unterschiedliche Werte.
5.2 Sammlungen mit Mengenoperationen vergleichen
Mengenoperationen drücken Fragen zur Zugehörigkeit in zwei Sammlungen aus. Verwende die Operation, die zur Frage passt: Personen in mindestens einer Sammlung, nur gemeinsame Mitglieder oder Mitglieder, die nach Ausschlüssen übrig bleiben.
Die vier Operationen lesen
Angenommen, die Kursteilnahmen sind:
python = {"Ana", "Ben", "Cara", "Dev"}
sql = {"Ben", "Dev", "Eli"}
| Ausdruck | Zugehörigkeitsregel | Mitglieder, alphabetisch aufgeführt |
|---|---|---|
| `python | sql` | In einer oder beiden Mengen |
python & sql | In beiden Mengen | Ben, Dev |
python - sql | In Python, aber nicht in SQL | Ana, Cara |
python ^ sql | In genau einer Menge | Ana, Cara, Eli |
Die Vereinigungsmenge enthält alle fünf Studierenden jeweils einmal. Die Schnittmenge enthält nur die beiden gemeinsamen Studierenden. Die Differenzmenge geht von der linken Menge aus und schließt alles aus, was in der rechten Menge liegt. Wird die Differenz umgekehrt, ändert sich die Frage: sql - python enthält nur Eli. Die symmetrische Differenz enthält die beiden nicht überlappenden Teile; sie entspricht der Vereinigungsmenge abzüglich der Schnittmenge.
Die benannten Formen sind python.union(sql), python.intersection(sql), python.difference(sql) und python.symmetric_difference(sql).
Eine Beziehung prüfen
a <= b fragt, ob jedes Element von a zu b gehört. Das ist die Teilmengenprüfung. a < b verlangt außerdem, dass b mindestens ein weiteres Element enthält. Damit ist a eine echte Teilmenge. a >= b und a > b prüfen die entsprechenden Obermengenbeziehungen.
print({"Ben"} <= sql)
print(sql <= sql)
print(sql < sql)
print(python.isdisjoint(sql))
Diese Anweisungen geben True, True, False und False aus. Eine Menge ist eine Teilmenge ihrer selbst, aber keine echte Teilmenge ihrer selbst. Disjunkte Mengen haben kein gemeinsames Element; Python und SQL haben Ben und Dev gemeinsam. Auch die Methodenformen issubset und issuperset geben boolesche Ergebnisse zurück.
Ergebnisse getrennt halten oder eine Menge verändern
result = a | b erstellt eine neue Menge und lässt beide Eingaben unverändert. Die Formen zur direkten Veränderung a |= b, a &= b, a -= b und a ^= b ändern a zur Vereinigungsmenge, Schnittmenge, Differenzmenge beziehungsweise symmetrischen Differenz. Jeder andere Name, der auf dieselbe Menge verweist, sieht die Änderung.
Benannte Mengenmethoden akzeptieren iterierbare Objekte wie Listen. python.union(["Fay"]) funktioniert. Die gewöhnlichen Mengenoperatoren benötigen Mengen als Operanden: {"a"} | ["b"] löst TypeError aus.
Verwende |, um Mengen zu verbinden, nicht +. Unterscheide außerdem & von and: {1, 2} and {3} gibt {3} zurück, weil die linke Menge als wahr ausgewertet wird. Gemeinsame Elemente werden nicht berechnet.
Fehlende Anforderungen finden
required = {"python", "sql", "git"}
skills = {"python", "excel", "git"}
missing = required - skills
extra = skills - required
qualified = required <= skills
Die Menge der fehlenden Fähigkeiten enthält "sql"; die Menge der zusätzlichen Fähigkeiten enthält "excel". Die Schnittmenge enthält "git" und "python". qualified ist False, weil mindestens eine erforderliche Fähigkeit fehlt. Ein Bewerber kann viele Fähigkeiten haben und dennoch die Teilmengenprüfung nicht bestehen: Alle konkret geforderten Elemente müssen vorhanden sein.
Wichtige Erkenntnisse
|umfasst Elemente aus einer oder beiden Mengen,&aus beiden und^aus genau einer.a - benthält nur Elemente vona, die inbfehlen.<=erlaubt gleiche Mengen;<verlangt eine echte Teilmenge.isdisjointprüft, ob keine gemeinsamen Elemente vorhanden sind.- Gewöhnliche Mengenoperatoren erzeugen Ergebnisse; Formen zur direkten Veränderung ändern die linke Menge.
5.3 Die passende Sammlung für eine Aufgabe wählen
Wähle eine Sammlung nach der Aufgabe, die das Programm damit erledigen muss. Reihenfolge, Wiederholungen, Nachschlagen über Namen und Veränderlichkeit sind unterschiedliche Anforderungen. Ein Programm kann mehrere Sammlungstypen verwenden, weil verschiedene Teile seiner Daten unterschiedlichen Zwecken dienen.
Die eingebauten Sammlungen vergleichen
| Datentyp | Wie du auf Daten zugreifst | Reihenfolge und Wiederholungen | Kann die Sammlung verändert werden? |
|---|---|---|---|
| Liste | Über Position | Geordnet; Wiederholungen erlaubt | Ja |
| Tupel | Über Position | Geordnet; Wiederholungen erlaubt | Nein |
| Wörterbuch | Über Schlüssel | Einfügereihenfolge; eindeutige Schlüssel | Ja |
| Menge | Über Zugehörigkeit | Keine garantierte Reihenfolge; eindeutige Elemente | Ja |
Eine Liste eignet sich für eine Folge von Ereignissen: Die Reihenfolge ist wichtig, und dasselbe Ereignis kann mehrmals auftreten. Ein Tupel eignet sich für eine feste Gruppe zusammengehöriger Werte, etwa Koordinaten. Ein Tupel kann ein veränderliches Objekt enthalten, sodass die festen Plätze des Tupels nicht jedes enthaltene Objekt unveränderlich machen. Nur ein Tupel aus hashbaren Elementen kann ein Wörterbuchschlüssel oder Mengenelement sein.
Ein Wörterbuch eignet sich für benannte Informationen: Eine ID führt zu einem Datensatz oder ein Produktname zu einer Menge. Seine Werte können sich wiederholen und ganze Sammlungen sein. Eine Menge eignet sich für eine Zugehörigkeitsfrage: Das Programm muss wissen, ob eine ID vorhanden ist, und braucht keinen separaten Wert dafür.
Die für die Aufgabe nötigen Informationen bewahren
Die Umwandlung von [1, 2, 1] in eine Menge verliert sowohl das wiederholte Vorkommen als auch die Reihenfolge. Für eine Liste unterschiedlicher Elemente ist das nützlich, für ein vollständiges Ereignisprotokoll aber falsch. Ein Wörterbuch wie {"reader": True, "editor": True} kann oft zu {"reader", "editor"} werden, wenn die Werte keine zusätzlichen Informationen enthalten. Benötigt jede Rolle eine Berechtigungsstufe, behalte das Wörterbuch.
Für die Gleichheit ist die Bedeutung jeder Sammlung entscheidend. [1, 2] == [2, 1] ist False, weil die Reihenfolge der Sequenzen unterschiedlich ist. {1, 2} == {2, 1} ist True. Wörterbücher mit gleichen Schlüssel-Wert-Paaren sind beim Vergleich gleich, auch wenn die Schlüssel in unterschiedlicher Reihenfolge eingefügt wurden. Ihre Einfügereihenfolge wirkt sich auf das Durchlaufen aus, nicht auf diesen Gleichheitstest.
Wörterbuchschlüssel als Mengen vergleichen
store_a = {"pens": 10, "pads": 4, "ink": 2}
store_b = {"pads": 7, "clips": 30, "ink": 5}
common = store_a.keys() & store_b.keys()
only_a = store_a.keys() - store_b.keys()
Die gemeinsamen Schlüssel sind "ink" und "pads"; only_a enthält "pens". Dies sind geführte Produkte, unabhängig von ihren Mengen. Die beiden Geschäfte haben unterschiedliche Mengen an Tinte, aber Tinte ist dennoch ein gemeinsamer Schlüssel.
Schlüsselansichten von Wörterbüchern unterstützen Mengenoperationen, weil Schlüssel eindeutig und hashbar sind. Wertansichten unterstützen diese Operatoren nicht: store_a.values() & {1} löst TypeError aus. Werte lassen sich in eine Menge umwandeln, wenn sie hashbar sind. Dabei gehen aber wiederholte Werte verloren, und die Frage unterscheidet sich vom Vergleich der Produktschlüssel.
Strukturen in einem Programm kombinieren
Eine Bibliothek kann ein Wörterbuch verwenden, das Buch-IDs Datensatzwörterbüchern zuordnet, dazu eine Menge der aktuell ausgeliehenen IDs und eine Liste der heutigen Ausleihen in zeitlicher Reihenfolge. Ein Tupel wie ("Dune", 1965) hält einen Titel und ein Jahr zusammen. Das Wörterbuch findet die Details eines Buches; die Menge prüft den Ausleihstatus; die Liste bewahrt den Tagesverlauf.
Wichtige Erkenntnisse
- Verwende Wörterbücher zum Nachschlagen über Namen oder IDs und Mengen für die Zugehörigkeit unterschiedlicher Elemente.
- Verwende Listen für geordnete, veränderliche Sequenzen und Tupel für feste Gruppen.
- Die Gleichheit von Listen hängt von der Reihenfolge ab; bei Wörterbüchern und Mengen ist das nicht so.
- Mengenoperationen auf Schlüsselansichten vergleichen Schlüssel, nicht die darunter gespeicherten Werte.
Python-Wörterbücher: Beispiele
1Ein Wörterbuch für den Warenbestand erstellen und pflegen
14 Schritte
- 1EinführungInformationen über einen Namen finden
Ein Warenbestand muss einen Produktnamen mit seiner Menge verbinden. Ein Wörterbuch speichert diese Beziehung als Schlüssel-Wert-Paar: Der Name ist der Schlüssel und die Menge der Wert.
Du wirst einen kleinen Warenbestand erstellen, entscheiden, was ein fehlendes Produkt bedeutet, und Änderungen an vorhandenen und neuen Produkten verfolgen. Behalte zwei Dinge getrennt im Blick: ob ein Schlüssel existiert und welchen Wert er speichert.
- 2BeispielDen ersten Warenbestand schreiben
stock = {"pens": 10, "pads": 4}Jeder Doppelpunkt verbindet einen Schlüssel mit seinem Wert, und das Komma trennt die Paare.
stock["pens"]liest10;len(stock)ist2, die Anzahl der Paare.Der Schlüssel bezeichnet das Produkt.
stock[0]würde nach dem Schlüssel0suchen, nicht nach dem ersten Produkt. Obwohl Wörterbücher die Einfügereihenfolge bewahren, wird auf ihre Einträge weiterhin über Schlüssel zugegriffen. - 3ErklärungSchlüssel wählen, die Python speichern kann
Schlüssel müssen hashbar sein. Zeichenketten und Zahlen funktionieren ebenso wie Tupel, die nur hashbare Elemente enthalten. Ein Ort wie
(2, 3)kann ein einzelner Schlüssel sein, die Liste[2, 3]dagegen nicht.Werte können jeden Datentyp haben, auch Listen oder Wörterbücher. Diese Regel gilt für den Schlüssel. Eine Liste als Wert zu speichern hindert das Paar also nicht daran, gültig zu sein.
- 4HerausforderungDie gespeicherten Paare zählen
Welche Länge hat
{"pens": 10, "pads": 4, "pens": 7}und welcher Wert ist für"pens"gespeichert?---reveal---
Die Länge ist
2und für Stifte ist der Wert7gespeichert. Das spätere Paar ersetzt den früheren Wert unter demselben Schlüssel. Es erzeugt keinen zweiten Eintrag für Stifte. Verschiedene Schlüssel dürfen sich einen Wert teilen, aber ein Schlüssel kann nicht zwei separate Paare enthalten. - 5ErklärungEntscheiden, was ein fehlender Schlüssel bedeutet
stock["clips"]löstKeyErroraus, weil der aktuelle Warenbestand keinen Schlüssel für Büroklammern hat. Verwende den direkten Zugriff, wenn ein Datensatz erforderlich ist und ein fehlender Datensatz beachtet werden muss.stock.get("clips", 0)gibt dagegen den Ersatzwert null zurück, ohne Büroklammern hinzuzufügen. Das passt zu einer Berechnung, bei der ein fehlendes Produkt als nicht vorrätig zählen soll. Das Wörterbuch hat nach diesem Aufruf weiterhin zwei Einträge. - 6KernaussageAuch eine gespeicherte null hat einen Schlüssel
Angenommen,
stock["pads"] = 0hält fest, dass Blöcke ausverkauft sind."pads" in stockist weiterhinTrue, weil der Datensatz existiert.if stock.get("pads"):überspringt den Zweig, weil null als falsch gilt. Dieser Test kann nicht zwischen ausverkauft und einem fehlenden Datensatz unterscheiden, derNonezurückgibt. Wenn es darum geht, ob ein Datensatz existiert, prüfe den Schlüssel mitin. - 7HerausforderungAusverkaufte Produkte sichtbar halten
Ausgehend von
stock = {"pens": 10, "pads": 0}soll ein Bericht die Menge für Blöcke anzeigen und für ein fehlendes Produkt"missing"ausgeben. Welcher Test soll entscheiden, obstock[item]gelesen wird?---reveal---
Verwende
if item in stock:. Blöcke bestehen diesen Test und der Wert null wird angezeigt. Gib imelse-Zweig"missing"aus. Eine Wahrheitswertprüfung der zurückgegebenen Menge würde den Datensatz des ausverkauften Produkts fälschlich als fehlend behandeln. - 8BeispielEinen Verkauf und eine Lieferung erfassen
Beginne mit einem neuen Warenbestand:
stock = {"pens": 10, "pads": 4} stock["pens"] -= 3 stock["clips"] = 50Der Verkauf liest die alte Anzahl der Stifte und speichert
7. Die Lieferung erzeugt einen neuen Schlüssel für Büroklammern mit dem Wert50. Die Zeile mit-=setzt voraus, dass der Schlüssel für Stifte bereits existiert; eine einfache Zuweisung kann einen fehlenden Schlüssel erstellen. Ein Wörterbuch hat keine Methodeappend. - 9BeispielEine entfernte Menge zurückerhalten
Fahre mit dem Warenbestand fort:
removed = stock.pop("pads")removedwird zu4und das Wörterbuch zu{"pens": 7, "clips": 50}.popverändert die Sammlung und gibt zugleich den entfernten Wert zurück.Verwende
del stock["pads"], wenn du nur das Entfernen benötigst. Beide Formen lösen bei einem fehlenden SchlüsselKeyErroraus, außer wennpopeinen Standardwert erhält, etwastock.pop("pads", 0). - 10HerausforderungEin zweites Entfernen behandeln
Der aktuelle Warenbestand ist
{"pens": 7, "clips": 50}. Was gibtstock.pop("pads", 0)zurück und was geschieht mit dem Warenbestand?---reveal---
Der Aufruf gibt
0zurück und lässt den Warenbestand unverändert, weil Blöcke bereits fehlen. Der Standardwert verhindert einen Fehler wegen des fehlenden Schlüssels; er erzeugt kein Paar für Blöcke. Ein vorhandener Schlüssel würde dagegen entfernt und sein gespeicherter Wert zurückgegeben. - 11ErklärungEinstellungen zusammenführen und die Basis bewahren
Für zwei Wörterbücher erstellt
base | overridesein neues Ergebnis; bei gemeinsamen Schlüsseln gilt der Wert von rechts:base = {"size": 2, "color": "blue"} result = base | {"size": 5}resulthat die Größe5und die Farbe"blue";basehat weiterhin die Größe2. Dieser Operator ist seit Python 3.9 verfügbar.base.update(overrides)würde dagegen die Basis verändern undNonezurückgeben. - 12TippDie Reihenfolge bei Änderungen verfolgen
Das Ersetzen eines Werts belässt seinen Schlüssel an derselben Stelle. Wird ein Schlüssel gelöscht und erneut hinzugefügt, steht er am Ende.
popitem()entfernt das zuletzt eingefügte Paar, nicht den größten Wert.Unterscheide auch die Rückgabewerte der Methoden:
update()undclear()gebenNonezurück, währendpop()einen Wert zurückgibt. Weise ein Aktualisierungsergebnis nicht wieder dem Namen zu, den du für das Wörterbuch benötigst. - 13HerausforderungEinen Standardwert ohne Überschreiben verwenden
Ein Programm beginnt mit
stock = {"pens": 7}. Es ruftstock.get("clips", 20)und dannstock.setdefault("clips", 5)auf und addiert anschließend2zustock["clips"]. Wie viele Büroklammern sind am Ende vorhanden?---reveal---
Es sind
7.getgibt20zurück, fügt aber nichts ein.setdefaulterstellt dann den Eintrag für Büroklammern mit5, und die letzte Aktualisierung addiert2. Ein Standardwert beim Nachschlagen ist kein gespeicherter Wert, solange eine Operation ihn nicht tatsächlich einfügt. - 14ZusammenfassungSchlüssel und Wert verfolgen
Erstelle ein Wörterbuch aus Schlüssel-Wert-Paaren und wähle dann bewusst das Zugriffsverhalten: direkten Zugriff für erforderliche Datensätze,
infür das Vorhandensein undgetfür einen Ersatzwert.Zuweisungen fügen hinzu oder ersetzen. Entfernungsmethoden können nützliche Daten zurückgeben, und beim Zusammenführen kann entweder ein neues Wörterbuch erstellt oder ein vorhandenes verändert werden. Halte beim Nachvollziehen von Code jedes Einfügen, Ersetzen eines Werts und Löschen in der jeweiligen Reihenfolge fest.
2Wörterbuchdaten in Berichte umwandeln
12 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungWählen, was jede Schleife erhält
- 2BeispielBeide Teile eines Paars erhalten
- 3KernaussageEine Ansicht bleibt verbunden
- 4BeispielNach einem gespeicherten Wert sortieren
- 5HerausforderungNamen nach ihren Werten ordnen
- 6BeispielEin Wörterbuch mit einer Schleife erstellen
- 7VerbindungDieselbe Regel kompakt ausdrücken
- 8BeispielZuerst filtern, dann das Paar erzeugen
- 9HerausforderungEinen Filter und eine Umwandlung kombinieren
- 10TippDie Paare vor dem Erstellen prüfen
- 11HerausforderungKleine Einträge entfernen, ohne die Schleife zu stören
- 12ZusammenfassungDie Eingabe auf das Ergebnis abstimmen
3Zählwerte, Gruppen und Kategoriesummen erstellen
13 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungFür jede Kategorie ein Ergebnis sammeln
- 2BeispielEinem neuen Element seinen ersten Zählwert geben
- 3BeispielFür ein noch nicht gesehenes Element null verwenden
- 4HerausforderungDen Grund für einen unveränderten Zählwert finden
- 5TippVor der Wahl des Schlüssels bereinigen
- 6ErklärungDie Mitglieder jeder Gruppe bewahren
- 7BeispielEine Aktualisierung eines Listenwerts nachvollziehen
- 8KernaussageJede Gruppe braucht eine separate Liste
- 9HerausforderungEine automatisch erstellte Gruppe vorhersagen
- 10BeispielBeträge statt Vorkommen addieren
- 11BeispielDas arithmetische Mittel der Werte jeder Gruppe berechnen
- 12HerausforderungDen Beitrag jedes Datensatzes bestimmen
- 13ZusammenfassungDas Ergebnis zwischen Durchläufen bewahren
4Verschachtelte Datensätze lesen und zusammenfassen
11 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungDatensatz-IDs von Feldern trennen
- 2BeispielDen Weg zu einer Punktzahl verfolgen
- 3HerausforderungEinem neuen Datensatz ein Feld hinzufügen
- 4KernaussageEine äußere Kopie kann innere Daten gemeinsam referenzieren
- 5HerausforderungVersuchsnoten unabhängig halten
- 6BeispielEin arithmetisches Mittel pro Datensatz berechnen
- 7TippEinen Datensatz ohne Noten behandeln
- 8VerbindungFelder auf Datensatzebene lesen
- 9BeispielAlle Noten in den Datensätzen durchlaufen
- 10HerausforderungEin Feld und eine gespeicherte Liste kombinieren
- 11ZusammenfassungJede Ebene sichtbar halten
5Zugehörigkeit vergleichen und Sammlungen wählen
15 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungFragen, wer zu jeder Sammlung gehört
- 2ErklärungEine Sammlung eindeutiger Elemente erstellen
- 3TippDas gewünschte Element hinzufügen und entfernen
- 4BeispielDie Reihenfolge des ersten Auftretens bewahren
- 5HerausforderungDie ursprüngliche Reihenfolge unterschiedlicher Bezeichnungen bewahren
- 6BeispielAlle oder nur gemeinsame Studierende finden
- 7BeispielDie Differenz von links nach rechts lesen
- 8HerausforderungPersonen in genau einem Verein finden
- 9ErklärungJede Anforderung prüfen
- 10KernaussageEin Ergebnis von einer veränderten Menge unterscheiden
- 11VerbindungVerlauf, Identität und Zugehörigkeit bewahren
- 12BeispielSchlüssel ohne Vergleich der Mengen vergleichen
- 13HerausforderungEine Sammlung für ein wachsendes Protokoll wählen
- 14HerausforderungSchlüsselansichten mit einer Prüfung auf fehlende Datensätze kombinieren
- 15ZusammenfassungZuerst die Zugehörigkeitsfrage wählen
Python-Wörterbücher: Übungsaufgaben
Set 1: Python-Sammlungen lesen und verändern10 Übungsfragen
Frage 1 von 10
{"oak": 4, "pine": 7, "oak": 9}?Antwort zeigenAntwort ausblenden
"oak" behält seinen letzten Wert 9, sodass das Wörterbuch die zwei Schlüssel "oak" und "pine" hat. Wer alle drei geschriebenen Paare zählt, übersieht das Ersetzen: Ein Wörterbuch kann nicht zwei separate Einträge unter demselben Schlüssel enthalten. Die Anzahl der Einträge entspricht der Anzahl unterschiedlicher Schlüssel.Frage 2 von 10
levels = {"east": 0, "west": 5} der Ausdruck "east" in levels zurück?Antwort zeigenAntwort ausblenden
"east" ein Schlüssel ist. Er ist mit dem gespeicherten Wert null vorhanden. Bei einer Wahrheitswertprüfung des Werts gilt null als falsch, aber der Schlüssel wird dadurch nicht entfernt. Das Ergebnis von in ist ein boolescher Wert, nicht der unter dem Schlüssel gespeicherte Wert.Frage 3 von 10
Was gibt dieser Code aus?
seats = {"front": 6, "back": 8}
removed = seats.pop("front")
seats["back"] -= 2
print(removed, seats["back"])
Antwort zeigenAntwort ausblenden
pop("front") entfernt das Paar und gibt seinen Wert zurück, sodass removed zu 6 wird. Die verbleibende Anzahl der hinteren Sitze sinkt von 8 auf 6. Wer annimmt, dass pop den Wert None zurückgibt, verwechselt es mit Methoden wie clear, die eine Sammlung verändern, ohne ein Element zurückzugeben.Frage 4 von 10
sum({"small": 3, "large": 9}.values()) zurück?Antwort zeigenAntwort ausblenden
3 und 9, und sum addiert sie zu 12. Die zwei Schlüssel-Wert-Paare ergeben nicht die Summe 2; das wäre die Länge des Wörterbuchs. Der Aufruf von .values() wählt die Mengen aus, die die Berechnung benötigt.Frage 5 von 10
{name: len(name) for name in ["elm", "cedar"]}?Antwort zeigenAntwort ausblenden
len(name) liefert den zugehörigen Wert: 3 für "elm" und 5 für "cedar". Um die Paare umzukehren, müsste der Längenausdruck vor dem Doppelpunkt und der Namensausdruck danach stehen.Frage 6 von 10
Welchen Wert hat counts["up"] nach dieser Schleife?
counts = {}
for move in ["up", "left", "up", "up"]:
counts[move] = counts.get(move, 0) + 1
Antwort zeigenAntwort ausblenden
"up" speichert 1, das zweite erhöht den Wert auf 2 und das dritte auf 3. Der Eintrag "left" hat einen eigenen Zähler und erhöht "up" nicht. Würdest du alle vier Schleifendurchläufe zählen, erhieltest du die Gesamtzahl der Bewegungen, nicht die Häufigkeit dieser bestimmten Bewegung.Frage 7 von 10
Was ist groups["r"] nach diesem Code?
groups = {}
for word in ["rose", "mint", "reed"]:
groups.setdefault(word[0], []).append(word)
Antwort zeigenAntwort ausblenden
"r" und hängt "rose" an; "reed" kommt später zu derselben Liste hinzu. Die Gruppe "m" enthält "mint" separat. setdefault bewahrt eine vorhandene Liste und ersetzt sie daher beim letzten Durchlauf nicht durch eine neue leere Liste.Frage 8 von 10
devices = {"d7": {"ports": [2, 4, 8]}} der Ausdruck devices["d7"]["ports"][-1] zurück?Antwort zeigenAntwort ausblenden
[-1] das letzte Listenelement 8. Ein Wörterbuchschlüssel und ein Listenindex erfüllen innerhalb der Kette unterschiedliche Aufgaben. Die Listenlänge ist 3, aber der Ausdruck fragt nach einem Element, nicht nach seiner Länge.Frage 9 von 10
len(set([8, 2, 8, 5, 2])) zurück?Antwort zeigenAntwort ausblenden
8, 2 und 5. Wiederholte Vorkommen erzeugen keine neuen Elemente, also ist die Länge 3. Die Eingabeliste hat fünf Positionen, aber die Umwandlung in eine Menge verwirft die zusätzlichen Vorkommen, bevor len ausgewertet wird.Frage 10 von 10
{"read", "write"}. Ein Konto hat {"read", "share"} und eine neue Freigabe fügt {"write"} hinzu. Welcher Ausdruck prüft, ob das Konto nach der Freigabe alle Anforderungen erfüllt?Antwort zeigenAntwort ausblenden
Set 2: Zugriffe, Gruppen und Datensätze nachvollziehen10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
result und len(rates) nach rates = {"basic": 7} und result = rates.get("plus", 0)?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Was gibt dieser Code aus?
settings = {"sound": 2, "light": 4}
settings.update({"sound": 5})
del settings["sound"]
settings["sound"] = 1
print(list(settings))
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
wait = {"A": 9, "B": 3, "C": 6} der Ausdruck sorted(wait, key=wait.get) zurück?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
Was gibt dieser Code aus?
from collections import Counter
counts = Counter([4, 4, 7])
print(counts[9])
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Was gibt dieser Code aus?
groups = dict.fromkeys(["indoor", "outdoor"], [])
groups["indoor"].append(12)
groups["outdoor"].append(18)
print(groups["indoor"])
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Was gibt dieser Code aus?
original = {"r1": {"visits": 2}}
backup = original.copy()
backup["r1"]["visits"] += 3
backup["r2"] = {"visits": 1}
print(original["r1"]["visits"], "r2" in original)
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
{"scores": []}. Welche Bedingung sollte sum(scores) / len(scores) nach scores = record["scores"] absichern?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
"paused" aus states und erlaubt zugleich, dass das Element fehlt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
morning ^ evening für morning = {"Ivo", "June", "Kai"} und evening = {"June", "Mina"}?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 3: Fehler bei der Umwandlung von Sammlungen beheben10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
len({1: "first", True: "second", "1": "third"})?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
"missing" ausgeben, wenn der Produktschlüssel fehlt. Welcher Funktionskörper erfüllt diese Anforderung?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Welches Wörterbuch bleibt nach dieser Umkehrung übrig?
team = {"Luz": "design", "Omar": "support", "Pia": "design"}
by_role = {role: name for name, role in team.items()}
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
"go", nachdem die Wörter aus "Go go! Stop." mit lower().split() und word.strip(".,!?") gezählt wurden?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
[("repair", 14), ("delivery", 6), ("repair", 9)]. Was ist bei totals[category] = totals.get(category, 0) + amount der Wert von totals["repair"]?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
records.get("x9", {}).get("email", "none") zurück, wenn "x9" fehlt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Was gibt dieser Code aus?
records = {"a": {"scores": [6, 9]}, "b": {"scores": [8]},
"c": {"scores": []}}
count = 0
for info in records.values():
for score in info["scores"]:
if score >= 8:
count += 1
print(count)
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
list(dict.fromkeys(["z", "m", "z", "a"])) zurück?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
{2, 5} < {2, 5} zurück?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Was gibt dieser Code aus?
first = {"lamp": 4, "cord": 9, "plug": 2}
second = {"cord": 3, "plug": 8, "case": 5}
result = {name: first[name]
for name in first.keys() & second.keys()
if first[name] < second[name]}
print(sorted(result.items()))
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 4: Kenntnisse über Sammlungen kombinieren10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Was gibt dieser Code aus?
stock = {"bolts": 0}
first = stock.get("nuts", 4)
second = stock.setdefault("nuts", 6)
print(first, second, len(stock))
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Was gibt dieser Code aus?
base = {"size": 2, "mode": 1}
alias = base
merged = base | {"size": 5}
alias["mode"] = 3
print(merged["size"], merged["mode"], base["size"])
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
Was gibt dieser Code aus?
levels = {"low": 2, "high": 8, "mid": 5}
view = levels.keys()
for name in list(levels):
if levels[name] < 5:
del levels[name]
print(list(view))
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Was erzeugt dieser Code?
names = ["Rae", "Sol", "Tia"]
scores = [7, 9]
result = {name: score * 2 for name, score in zip(names, scores)
if score >= 8}
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Was gibt dieser Code aus?
from collections import defaultdict
groups = defaultdict(list)
groups["red"].append(5)
unused = groups["blue"]
print(len(groups), len(unused))
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Welches arithmetische Mittel insgesamt ergeben diese Daten, wenn jede Punktzahl gleich gewichtet wird?
records = {"p": {"scores": [10, 20]},
"q": {"scores": [90]}, "r": {"scores": []}}
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
Was gibt dieser Code aus?
records = {"v1": {"team": "north", "scores": [2, 6]},
"v2": {"team": "south", "scores": []},
"v3": {"team": "north", "scores": [4]}}
totals = {}
for info in records.values():
team = info["team"]
for score in info["scores"]:
totals[team] = totals.get(team, 0) + score
print(totals.get("south", 0), totals["north"])
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Was gibt dieser Code aus?
required = {"a", "b", "c"}
current = {"a", "d"}
missing = required - current
current |= {"b"}
print(sorted(missing), sorted(required - current))
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Was gibt dieser Code aus?
left = {"x": 2, "y": 4}
right = {"y": 4, "x": 2}
print(left == right, list(left) == list(right))
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe
Schlüsselbegriffe
A
Akkumulator
Aktualisierung
stock.update({"soap": 6}) führt eine Aktualisierung aus und gibt None zurück, nicht das aktualisierte Wörterbuch.Anzahl unterschiedlicher Werte
len(set(items)) ermitteln.[7, 7, 2, 7] ist zwei, während die Gesamtzahl der Vorkommen vier ist.C
Counter
"level" erstellter Counter erfasst zwei Vorkommen von "l", zwei von "e" und eines von "v".D
Datensatz
Deduplizierung
list(dict.fromkeys(items)) bewahrt bei hashbaren Elementen die Reihenfolge ihres ersten Auftretens.defaultdict
list erstelltes defaultdict beginnt eine separate leere Liste, sobald ein neuer Gruppenschlüssel erstmals gelesen wird.Dictionary Comprehension
{word: len(word) for word in words} speichert unter jedem Wort eine Länge.Differenzmenge
a - b enthält Elemente der linken Menge, die in der rechten Menge fehlen. Daher ist die Reihenfolge der Operanden wichtig.required - skills findet Anforderungen, die dem Bewerber fehlen, nicht seine zusätzlichen Fähigkeiten.discard
blocked.discard(address) erlaubt eine bereits entsperrte Adresse, ohne einen Fehler auszulösen.disjunkte Mengen
a.isdisjoint(b) den Wert True zurückgibt.E
echte Teilmenge
{2} < {2, 4} ist wahr, während {2} < {2} falsch ist, weil die Mengen gleich sind.Einfügereihenfolge
"west" vor "east", wenn es zuerst hinzugefügt wurde, selbst wenn sich sein Wert ändert.Element
3 erscheint einmal in set([3, 3, 5]), sodass die entstehende Menge nur zwei Elemente hat.F
Filter
if-Klausel einer Comprehension entscheidet, welche Eingaben Paare erzeugen.if quantity > 0 lässt beim Erstellen eines neuen Wörterbuchs Produkte mit einem Bestand von null weg.flache Kopie
formatierter Bericht
f"{name}: {average:.1f}" verwenden, um eine ID und ihr gerundetes arithmetisches Mittel anzuzeigen.frozenset
G
gemeinsam referenzierter veränderlicher Wert
dict.fromkeys(keys, []) eine Liste unter jedem Gruppenschlüssel ablegt.Gleichheit von Sammlungen
{"a": 1, "b": 2} gleich denselben Paaren, die in umgekehrter Reihenfolge eingefügt wurden.Gruppierung
"map" und "memo" in dieselbe Liste für "m".H
hashbar
(4, 7) ist hashbar und kann einen Ort in einem Raster bezeichnen, die Liste [4, 7] dagegen nicht.Häufigkeitstabelle
[2, 5, 2] speichert unter 2 den Zählwert zwei und unter 5 den Zählwert eins.I
Initialisierung
counts = {} innerhalb der Schleife würde die bei früheren Durchläufen gesammelten Zählwerte löschen.items-Ansicht
for city, temp in temps.items(): liefert jede Stadt zusammen mit ihrer Temperatur.Iteration
{"west": 4, "east": 9} durchläuft "west" und dann "east", nicht die gespeicherten Mengen.K
Kategoriesumme
KeyError
stock["soap"] löst KeyError aus, wenn im Bestandswörterbuch kein Eintrag für Seife existiert.L
Liste
M
Menge
N
Nachschlagen
prices["juice"] ruft den gespeicherten Preis ab, sofern das Wörterbuch den Schlüssel "juice" hat.O
Obermenge
a >= b prüft, ob a alle Elemente von b enthält, wobei Gleichheit erlaubt ist.skills >= required prüft, ob der Bewerber alle erforderlichen Fähigkeiten hat.optionales Feld
get kann daher einen Ersatzwert liefern, ohne KeyError auszulösen."no email" angezeigt werden, wenn ein Studierendendatensatz es nicht enthält.P
pop
inventory.pop("pads") verwendet pop, um die alte Menge zurückzuerhalten und zugleich das Produkt zu entfernen.popitem
"a" und dann "b" gibt popitem() das Paar für "b" zurück, selbst wenn sein Wert kleiner ist.Prüfung auf eine leere Liste
if scores: verhindert, dass ein Datensatz ohne Punktzahlen eine Division durch null verursacht.S
Schlüssel
"glue" ruft die Menge 3 aus einem Wörterbuch ab, das Mengen nach Produktnamen speichert.Schlüssel-Wert-Paar
"room": 12 verbindet den Feldnamen "room" mit der Zahl 12.Schnittmenge
Schnittmenge von Schlüsselansichten
& auf Schlüsselansichten von Wörterbüchern und liefert die in beiden Wörterbüchern vorhandenen Schlüssel, ohne ihre Werte zu vergleichen.setdefault
setdefault erstellt für eine neue Kategorie eine Liste und bewahrt die Liste einer vorhandenen Kategorie.Standardwert
get.stock.get("soap", 0) ist der Standardwert null; der Aufruf erstellt keinen Eintrag für Seife.Standardwertfabrik
defaultdict ohne Argumente aufruft, um beim Zugriff auf einen fehlenden Schlüssel einen Wert zu erstellen.list erstellt für jeden neuen Schlüssel in defaultdict(list) eine neue leere Liste.symmetrische Differenz
T
Teilmenge
<= erlaubt gleiche Mengen.required <= skills ist nur erfolgreich, wenn der Bewerber jede erforderliche Fähigkeit hat.Textnormalisierung
"Map" und "map" durch Kleinschreibung beider Formen einen gemeinsamen Schlüssel für die Wortzählung geben.tiefe Kopie
Tupel
("Dune", 1965) hält einen Titel und sein Erscheinungsjahr als ein Paar zusammen.Tupelentpackung
for name, score in scores.items(): macht beide Teile im Schleifenkörper verfügbar.U
Umkehrung eines Wörterbuchs
V
Veränderung eines Objekts
stock["soap"] = 6 ist eine Veränderung des Objekts, die über jeden anderen Namen für dieses Wörterbuch sichtbar ist.Vereinigungsmenge
morning | evening führt alle auf, die an mindestens einer der Veranstaltungen teilnehmen, auch Personen, die beide besuchen.Vergleichsschlüssel
key= übergebene Funktion erzeugt. Er dient zum Vergleichen von Elementen, während die ursprünglichen Elemente als Ergebnisse erhalten bleiben.sorted(wait, key=wait.get) ist jede gespeicherte Wartezeit der Vergleichsschlüssel für den zugehörigen Stationsnamen.verketteter Zugriff
devices["d7"]["ports"][0] erreicht einen Datensatz, dessen Anschlussliste und dann den ersten Anschluss.verschachtelte Schleife
verschachteltes Wörterbuch
students["ana"]["major"] ein Feld von Anas Datensatz lesen.W
Wert
"scores" kann eine Liste sein, sodass ein Datensatz alle Punktzahlen eines Lernenden enthält.Wörterbuch
{"tape": 8, "glue": 3}.Wörterbuchansicht
keys(), values() oder items() zurückgegeben wird und Änderungen am Wörterbuch widerspiegelt.stock.keys() gespeicherte Wörterbuchansicht zeigt ein neues Produkt, nachdem es hinzugefügt wurde.Z
zip
Zugehörigkeitsprüfung
in oder not in, ob eine Sammlung ein Element enthält; bei einem Wörterbuch prüft sie die Schlüssel."soap" in stock bleibt wahr, wenn die gespeicherte Menge an Seife null ist.Zusammenführen
a | b stammen die Werte gemeinsamer Schlüssel aus b und beide Eingaben bleiben unverändert.defaults | overrides lässt eine Überschreibung den Standardwert derselben Einstellung ersetzen.Über diese Einheit
Erstelle deine eigenen Lernmaterialien
Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.