Python-Wörterbücher und Mengen

Lerne, wie Python-Wörterbücher Werte unter Schlüsseln speichern. So kannst du Daten über Namen nachschlagen, Häufigkeiten zählen, Elemente in Kategorien gruppieren und Datensätze innerhalb anderer Datensätze organisieren. Verwende anschließend Mengen, um Duplikate zu entfernen und Sammlungen mithilfe von Vereinigungsmenge, Schnittmenge und Differenzmenge zu vergleichen. Lerne außerdem, wann ein Wörterbuch, eine Menge, eine Liste oder ein Tupel die richtige Wahl ist.

AnfängerEinheit 7 von 10 in Kurs: Python-Programmierung – Schleifen, Funktionen, Listen und Dateien

Was du lernst

  1. 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 erstellen
      Beschreibe 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 nachschlagen
      Lies einen Wert mit eckigen Klammern, prüfe mit in, ob ein Schlüssel existiert, und gib mit get() einen Standardwert vor, statt bei einem fehlenden Schlüssel abzubrechen.
    • Einträge hinzufügen, ändern und entfernen
      Fü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.
  2. 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 durchlaufen
      Verwende 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 erstellen
      Erstelle 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.
  3. 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ählen
      Erstelle eine Häufigkeitstabelle mit einem Wörterbuch aus Zählern, zähle Wörter in einem Text, finde die häufigsten Elemente und lerne Counter als Abkürzung kennen.
    • Elemente gruppieren und Werte nach Kategorien summieren
      Sammle 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.
  4. 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 abrufen
      Erstelle 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 zusammenfassen
      Verwende Schleifen, auch verschachtelte, um Datensätze auszugeben, zu filtern und zusammenzufassen, und behandle Datensätze mit fehlenden Feldern oder leeren Listen.
  5. 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 entfernen
      Schreibe 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 vergleichen
      Verwende 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ählen
      Vergleiche 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.

Python-Wörterbücher einfach erklärt

5 Kapitel

1

Daten 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 ProgrammsNü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öst KeyError aus, wenn der Schlüssel fehlt.
  • in prüft Schlüssel, auch solche mit dem Wert null oder einem leeren Wert.
  • get gibt 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
OperationWirkung 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] = value fü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.
  • pop gibt einen entfernten Wert zurück; popitem gibt das zuletzt eingefügte Paar zurück.
  • update und clear geben None zurück.
  • setdefault fü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.
2

Wö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 SchleifeWas 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.get vergleicht 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.
  • zip endet bei der kürzeren Eingabe.
  • Beim Umkehren eines Wörterbuchs können Einträge verloren gehen, wenn sich Werte wiederholen.
3

Daten 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) + 1 behandelt 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.
  • Counter erstellt 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.
  • setdefault und defaultdict(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.
4

Strukturierte 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 get auf 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.
5

Mengen 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
OperationWas 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.
  • remove löst bei einem fehlenden Element einen Fehler aus; discard erlaubt 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"}
AusdruckZugehörigkeitsregelMitglieder, alphabetisch aufgeführt
`pythonsql`In einer oder beiden Mengen
python & sqlIn beiden MengenBen, Dev
python - sqlIn Python, aber nicht in SQLAna, Cara
python ^ sqlIn genau einer MengeAna, 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 - b enthält nur Elemente von a, die in b fehlen.
  • <= erlaubt gleiche Mengen; < verlangt eine echte Teilmenge.
  • isdisjoint prü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
DatentypWie du auf Daten zugreifstReihenfolge und WiederholungenKann die Sammlung verändert werden?
ListeÜber PositionGeordnet; Wiederholungen erlaubtJa
TupelÜber PositionGeordnet; Wiederholungen erlaubtNein
WörterbuchÜber SchlüsselEinfügereihenfolge; eindeutige SchlüsselJa
MengeÜber ZugehörigkeitKeine garantierte Reihenfolge; eindeutige ElementeJa

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

5 Interaktive Lektionen

1

Ein Wörterbuch für den Warenbestand erstellen und pflegen

14 Schritte
Erstelle Schlüssel-Wert-Paare, wähle sichere Zugriffe und verfolge Bestandsänderungen und Zusammenführungen.
  1. 1
    Einfü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.

  2. 2
    BeispielDen 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"] liest 10; len(stock) ist 2, die Anzahl der Paare.

    Der Schlüssel bezeichnet das Produkt. stock[0] würde nach dem Schlüssel 0 suchen, nicht nach dem ersten Produkt. Obwohl Wörterbücher die Einfügereihenfolge bewahren, wird auf ihre Einträge weiterhin über Schlüssel zugegriffen.

  3. 3
    Erklä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.

  4. 4
    HerausforderungDie 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 2 und für Stifte ist der Wert 7 gespeichert. 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.

  5. 5
    ErklärungEntscheiden, was ein fehlender Schlüssel bedeutet

    stock["clips"] löst KeyError aus, 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.

  6. 6
    KernaussageAuch eine gespeicherte null hat einen Schlüssel

    Angenommen, stock["pads"] = 0 hält fest, dass Blöcke ausverkauft sind. "pads" in stock ist weiterhin True, 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, der None zurückgibt. Wenn es darum geht, ob ein Datensatz existiert, prüfe den Schlüssel mit in.

  7. 7
    HerausforderungAusverkaufte 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, ob stock[item] gelesen wird?

    ---reveal---

    Verwende if item in stock:. Blöcke bestehen diesen Test und der Wert null wird angezeigt. Gib im else-Zweig "missing" aus. Eine Wahrheitswertprüfung der zurückgegebenen Menge würde den Datensatz des ausverkauften Produkts fälschlich als fehlend behandeln.

  8. 8
    BeispielEinen Verkauf und eine Lieferung erfassen

    Beginne mit einem neuen Warenbestand:

    stock = {"pens": 10, "pads": 4}
    stock["pens"] -= 3
    stock["clips"] = 50
    

    Der Verkauf liest die alte Anzahl der Stifte und speichert 7. Die Lieferung erzeugt einen neuen Schlüssel für Büroklammern mit dem Wert 50. 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 Methode append.

  9. 9
    BeispielEine entfernte Menge zurückerhalten

    Fahre mit dem Warenbestand fort:

    removed = stock.pop("pads")
    

    removed wird zu 4 und das Wörterbuch zu {"pens": 7, "clips": 50}. pop verä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üssel KeyError aus, außer wenn pop einen Standardwert erhält, etwa stock.pop("pads", 0).

  10. 10
    HerausforderungEin zweites Entfernen behandeln

    Der aktuelle Warenbestand ist {"pens": 7, "clips": 50}. Was gibt stock.pop("pads", 0) zurück und was geschieht mit dem Warenbestand?

    ---reveal---

    Der Aufruf gibt 0 zurü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.

  11. 11
    ErklärungEinstellungen zusammenführen und die Basis bewahren

    Für zwei Wörterbücher erstellt base | overrides ein neues Ergebnis; bei gemeinsamen Schlüsseln gilt der Wert von rechts:

    base = {"size": 2, "color": "blue"}
    result = base | {"size": 5}
    

    result hat die Größe 5 und die Farbe "blue"; base hat weiterhin die Größe 2. Dieser Operator ist seit Python 3.9 verfügbar. base.update(overrides) würde dagegen die Basis verändern und None zurückgeben.

  12. 12
    TippDie 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() und clear() geben None zurück, während pop() einen Wert zurückgibt. Weise ein Aktualisierungsergebnis nicht wieder dem Namen zu, den du für das Wörterbuch benötigst.

  13. 13
    HerausforderungEinen Standardwert ohne Überschreiben verwenden

    Ein Programm beginnt mit stock = {"pens": 7}. Es ruft stock.get("clips", 20) und dann stock.setdefault("clips", 5) auf und addiert anschließend 2 zu stock["clips"]. Wie viele Büroklammern sind am Ende vorhanden?

    ---reveal---

    Es sind 7. get gibt 20 zurück, fügt aber nichts ein. setdefault erstellt dann den Eintrag für Büroklammern mit 5, und die letzte Aktualisierung addiert 2. Ein Standardwert beim Nachschlagen ist kein gespeicherter Wert, solange eine Operation ihn nicht tatsächlich einfügt.

  14. 14
    ZusammenfassungSchlü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, in für das Vorhandensein und get fü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.

2

Wörterbuchdaten in Berichte umwandeln

12 Schritte
Wähle Eingaben für Schleifen, sortiere nach Schlüsseln oder Werten und erstelle gefilterte oder umgewandelte Wörterbücher.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungWählen, was jede Schleife erhält
  2. 2
    BeispielBeide Teile eines Paars erhalten
  3. 3
    KernaussageEine Ansicht bleibt verbunden
  4. 4
    BeispielNach einem gespeicherten Wert sortieren
  5. 5
    HerausforderungNamen nach ihren Werten ordnen
  6. 6
    BeispielEin Wörterbuch mit einer Schleife erstellen
  7. 7
    VerbindungDieselbe Regel kompakt ausdrücken
  8. 8
    BeispielZuerst filtern, dann das Paar erzeugen
  9. 9
    HerausforderungEinen Filter und eine Umwandlung kombinieren
  10. 10
    TippDie Paare vor dem Erstellen prüfen
  11. 11
    HerausforderungKleine Einträge entfernen, ohne die Schleife zu stören
  12. 12
    ZusammenfassungDie Eingabe auf das Ergebnis abstimmen
3

Zählwerte, Gruppen und Kategoriesummen erstellen

13 Schritte
Verfolge das erste Auftreten, bewahre Gruppenmitglieder und berechne Ergebnisse für jede Kategorie.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungFür jede Kategorie ein Ergebnis sammeln
  2. 2
    BeispielEinem neuen Element seinen ersten Zählwert geben
  3. 3
    BeispielFür ein noch nicht gesehenes Element null verwenden
  4. 4
    HerausforderungDen Grund für einen unveränderten Zählwert finden
  5. 5
    TippVor der Wahl des Schlüssels bereinigen
  6. 6
    ErklärungDie Mitglieder jeder Gruppe bewahren
  7. 7
    BeispielEine Aktualisierung eines Listenwerts nachvollziehen
  8. 8
    KernaussageJede Gruppe braucht eine separate Liste
  9. 9
    HerausforderungEine automatisch erstellte Gruppe vorhersagen
  10. 10
    BeispielBeträge statt Vorkommen addieren
  11. 11
    BeispielDas arithmetische Mittel der Werte jeder Gruppe berechnen
  12. 12
    HerausforderungDen Beitrag jedes Datensatzes bestimmen
  13. 13
    ZusammenfassungDas Ergebnis zwischen Durchläufen bewahren
4

Verschachtelte Datensätze lesen und zusammenfassen

11 Schritte
Verfolge verkettete Zugriffe, kopiere Datensätze bewusst und erstelle Berichte über gespeicherte Listen.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungDatensatz-IDs von Feldern trennen
  2. 2
    BeispielDen Weg zu einer Punktzahl verfolgen
  3. 3
    HerausforderungEinem neuen Datensatz ein Feld hinzufügen
  4. 4
    KernaussageEine äußere Kopie kann innere Daten gemeinsam referenzieren
  5. 5
    HerausforderungVersuchsnoten unabhängig halten
  6. 6
    BeispielEin arithmetisches Mittel pro Datensatz berechnen
  7. 7
    TippEinen Datensatz ohne Noten behandeln
  8. 8
    VerbindungFelder auf Datensatzebene lesen
  9. 9
    BeispielAlle Noten in den Datensätzen durchlaufen
  10. 10
    HerausforderungEin Feld und eine gespeicherte Liste kombinieren
  11. 11
    ZusammenfassungJede Ebene sichtbar halten
5

Zugehörigkeit vergleichen und Sammlungen wählen

15 Schritte
Entferne Wiederholungen, verwende Mengenoperationen und kombiniere Mengen mit Datensätzen und geordneten Sequenzen.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungFragen, wer zu jeder Sammlung gehört
  2. 2
    ErklärungEine Sammlung eindeutiger Elemente erstellen
  3. 3
    TippDas gewünschte Element hinzufügen und entfernen
  4. 4
    BeispielDie Reihenfolge des ersten Auftretens bewahren
  5. 5
    HerausforderungDie ursprüngliche Reihenfolge unterschiedlicher Bezeichnungen bewahren
  6. 6
    BeispielAlle oder nur gemeinsame Studierende finden
  7. 7
    BeispielDie Differenz von links nach rechts lesen
  8. 8
    HerausforderungPersonen in genau einem Verein finden
  9. 9
    ErklärungJede Anforderung prüfen
  10. 10
    KernaussageEin Ergebnis von einer veränderten Menge unterscheiden
  11. 11
    VerbindungVerlauf, Identität und Zugehörigkeit bewahren
  12. 12
    BeispielSchlüssel ohne Vergleich der Mengen vergleichen
  13. 13
    HerausforderungEine Sammlung für ein wachsendes Protokoll wählen
  14. 14
    HerausforderungSchlüsselansichten mit einer Prüfung auf fehlende Datensätze kombinieren
  15. 15
    ZusammenfassungZuerst die Zugehörigkeitsfrage wählen

Python-Wörterbücher: Übungsaufgaben

40 Übungsfragen in 4 Sets

Set 1: Python-Sammlungen lesen und verändern10 Übungsfragen

Frage 1 von 10

Wie viele Einträge enthält {"oak": 4, "pine": 7, "oak": 9}?
  1. 3
  2. 2
  3. 4
  4. 6
Antwort zeigenAntwort ausblenden
Antwort: B
Der wiederholte Schlüssel "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

Was gibt für levels = {"east": 0, "west": 5} der Ausdruck "east" in levels zurück?
  1. False
  2. 0
  3. None
  4. True
Antwort zeigenAntwort ausblenden
Antwort: D
Die Zugehörigkeitsprüfung prüft, ob "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"])
  1. 6 6
  2. 6 8
  3. None 6
  4. 0 6
Antwort zeigenAntwort ausblenden
Antwort: A
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

Was gibt sum({"small": 3, "large": 9}.values()) zurück?
  1. 2
  2. 9
  3. 12
  4. 6
Antwort zeigenAntwort ausblenden
Antwort: C
Die Wertansicht liefert die Zahlen 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

Welches Wörterbuch erstellt {name: len(name) for name in ["elm", "cedar"]}?
  1. {3: 'elm', 5: 'cedar'}
  2. {'elm': 5, 'cedar': 3}
  3. {'elm': 3, 'cedar': 5}
  4. {'elm': 1, 'cedar': 1}
Antwort zeigenAntwort ausblenden
Antwort: C
Der Ausdruck vor dem Doppelpunkt liefert jeden Schlüssel, sodass die Namen Schlüssel bleiben. 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
  1. 3
  2. 1
  3. 2
  4. 4
Antwort zeigenAntwort ausblenden
Antwort: A
Das erste "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)
  1. ['reed']
  2. ['rose', 'mint', 'reed']
  3. ['r', 'r']
  4. ['rose', 'reed']
Antwort zeigenAntwort ausblenden
Antwort: D
Das erste Wort erstellt die Liste für "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

Was gibt für devices = {"d7": {"ports": [2, 4, 8]}} der Ausdruck devices["d7"]["ports"][-1] zurück?
  1. 2
  2. 8
  3. 4
  4. 3
Antwort zeigenAntwort ausblenden
Antwort: B
Der erste Zugriff wählt den Gerätedatensatz, der zweite dessen Anschlussliste und [-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

Was gibt len(set([8, 2, 8, 5, 2])) zurück?
  1. 2
  2. 4
  3. 3
  4. 5
Antwort zeigenAntwort ausblenden
Antwort: C
Die Menge enthält die drei unterschiedlichen Zahlen 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

Ein Dienst verlangt {"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?
  1. required <= (current | grant)
  2. required <= (current & grant)
  3. required >= (current | grant)
  4. required < (current & grant)
Antwort zeigenAntwort ausblenden
Antwort: A
Die Vereinigungsmenge fügt die Freigabe zu den aktuellen Berechtigungen hinzu und ergibt Lesen, Teilen und Schreiben. Die Teilmengenprüfung prüft dann, ob jede erforderliche Berechtigung zu dieser vereinigten Menge gehört. Die Schnittmenge würde nur Berechtigungen behalten, die bereits in beiden Eingaben vorhanden sind. Diese sind hier disjunkt, sodass die neue Freigabe verworfen statt hinzugefügt würde.
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

Was sind result und len(rates) nach rates = {"basic": 7} und result = rates.get("plus", 0)?
  1. 0 und 2
  2. None und 1
  3. 0 und 1
  4. 7 und 1
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))
  1. ['light', 'sound']
  2. ['sound', 'light']
  3. ['light']
  4. ['sound', 'light', 'sound']
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Was gibt für wait = {"A": 9, "B": 3, "C": 6} der Ausdruck sorted(wait, key=wait.get) zurück?
  1. ['A', 'B', 'C']
  2. ['B', 'C', 'A']
  3. ['A', 'C', 'B']
  4. [3, 6, 9]
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])
  1. None
  2. 1
  3. KeyError: 9
  4. 0
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"])
  1. [12]
  2. [18]
  3. [[12], [18]]
  4. [12, 18]
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)
  1. 2 False
  2. 5 False
  3. 5 True
  4. 2 True
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Ein Datensatz enthält {"scores": []}. Welche Bedingung sollte sum(scores) / len(scores) nach scores = record["scores"] absichern?
  1. if scores:
  2. if "scores" in record:
  3. if scores is not None:
  4. if len(scores) >= 0:
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Welcher Methodenaufruf entfernt "paused" aus states und erlaubt zugleich, dass das Element fehlt?
  1. states.remove("paused")
  2. states.pop("paused")
  3. states.discard("paused")
  4. states.clear("paused")
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Welche Elemente enthält morning ^ evening für morning = {"Ivo", "June", "Kai"} und evening = {"June", "Mina"}?
  1. Ivo, June, Kai, Mina
  2. Ivo, Kai, Mina
  3. June
  4. Ivo, Kai
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein Überwachungsprogramm muss jeden Sensorwert in der Reihenfolge seines Eingangs einschließlich Wiederholungen speichern und separat prüfen, ob jede Sensor-ID zugelassen ist. Welches Paar von Sammlungen passt am besten?
  1. Eine Liste von Messwerten und eine Menge zugelassener IDs.
  2. Eine Menge von Messwerten und eine Liste zugelassener IDs.
  3. Ein Wörterbuch mit Messwerten als Schlüsseln und eine Menge zugelassener IDs.
  4. Ein Tupel von Messwerten und ein Wörterbuch mit Messwerten als Schlüsseln.
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

Was ist len({1: "first", True: "second", "1": "third"})?
  1. 1
  2. 3
  3. 6
  4. 2
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein Bestandsbericht muss eine gespeicherte Menge einschließlich null oder "missing" ausgeben, wenn der Produktschlüssel fehlt. Welcher Funktionskörper erfüllt diese Anforderung?
  1. if stock.get(product):
        return stock[product]
    return "missing"
    
  2. if product in stock:
        return stock[product]
    return "missing"
    
  3. return stock.get(product) or "missing"
    
  4. if product in stock.values():
        return stock[product]
    return "missing"
    
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()}
  1. {'design': 'Pia', 'support': 'Omar'}
  2. {'design': ['Luz', 'Pia'], 'support': ['Omar']}
  3. {'design': 'Luz', 'support': 'Omar'}
  4. {'Luz': 'design', 'Omar': 'support', 'Pia': 'design'}
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Welchen Zählwert hat "go", nachdem die Wörter aus "Go go! Stop." mit lower().split() und word.strip(".,!?") gezählt wurden?
  1. 2
  2. 1
  3. 3
  4. 0
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Eine Summenschleife verarbeitet [("repair", 14), ("delivery", 6), ("repair", 9)]. Was ist bei totals[category] = totals.get(category, 0) + amount der Wert von totals["repair"]?
  1. 9
  2. 14
  3. 23
  4. 29
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Ein Wörterbuch enthält Datensätze als Wörterbuchwerte. Was gibt records.get("x9", {}).get("email", "none") zurück, wenn "x9" fehlt?
  1. {}
  2. None
  3. KeyError: 'x9'
  4. "none"
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)
  1. 0
  2. 1
  3. 2
  4. 3
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Was gibt list(dict.fromkeys(["z", "m", "z", "a"])) zurück?
  1. ['a', 'm', 'z']
  2. ['z', 'm', 'a']
  3. ['z', 'm', 'z', 'a']
  4. ['m', 'z', 'a']
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Was gibt {2, 5} < {2, 5} zurück?
  1. True
  2. False
  3. set()
  4. None
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()))
  1. [('cord', 9)]
  2. [('plug', 8)]
  3. [('cord', 9), ('plug', 2)]
  4. [('plug', 2)]
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

Ein Raster speichert Werte anhand von Koordinatenpaaren. Welchen Schlüssel kann Python direkt akzeptieren?
  1. [3, 5]
  2. (3, 5)
  3. {3, 5}
  4. {"x": 3, "y": 5}
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))
  1. 4 4 2
  2. 4 6 1
  3. 4 6 2
  4. 6 6 2
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"])
  1. 5 3 5
  2. 5 3 2
  3. 2 1 2
  4. 5 1 2
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))
  1. ['low', 'high', 'mid']
  2. ['high', 'mid']
  3. ['mid', 'high']
  4. ['low']
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}
  1. {'Sol': 18}
  2. {'Rae': 14, 'Sol': 18}
  3. {'Sol': 9}
  4. {'Sol': 18, 'Tia': 18}
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))
  1. 1 0
  2. 2 1
  3. 1 1
  4. 2 0
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": []}}
  1. 40.0
  2. 52.5
  3. 60.0
  4. 30.0
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"])
  1. 0 4
  2. 1 12
  3. 0 12
  4. 0 8
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))
  1. ['c'] ['c']
  2. ['b', 'c'] ['b', 'c']
  3. ['b', 'c'] ['c']
  4. ['d'] ['c']
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))
  1. True False
  2. True True
  3. False True
  4. False False
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe

Schlüsselbegriffe

62 Schlüsselbegriffe, jeweils mit Definition

A

Akkumulator
Ein Akkumulator ist eine Variable, die über Schleifendurchläufe hinweg ein Ergebnis sammelt, etwa eine laufende Summe oder eine Anzahl passender Einträge.
Ein vor der Notenschleife initialisierter Akkumulator kann alle Studierenden zählen, die die zum Bestehen nötige Punktzahl erreichen.
Aktualisierung
Eine Aktualisierung kopiert Paare in ein vorhandenes Wörterbuch, fügt neue Schlüssel hinzu und ersetzt Werte unter bereits vorhandenen Schlüsseln.
Der Aufruf stock.update({"soap": 6}) führt eine Aktualisierung aus und gibt None zurück, nicht das aktualisierte Wörterbuch.
Anzahl unterschiedlicher Werte
Die Anzahl unterschiedlicher Werte gibt an, wie viele verschiedene Werte vorkommen. Sie lässt sich bei hashbaren Eingabeelementen mit len(set(items)) ermitteln.
Die Anzahl unterschiedlicher Werte in [7, 7, 2, 7] ist zwei, während die Gesamtzahl der Vorkommen vier ist.

C

Counter
Ein Counter ist ein Wörterbuchtyp der Standardbibliothek zum Zählen hashbarer Elemente, der beim Zugriff auf ein fehlendes Element null zurückgibt.
Ein aus "level" erstellter Counter erfasst zwei Vorkommen von "l", zwei von "e" und eines von "v".

D

Datensatz
Ein Datensatz speichert zusammengehörige Felder zu einer Einheit, oft als Wörterbuch, dessen Schlüssel Felder wie Alter, Studienfach oder Punktzahlen benennen.
Ein Datensatz für ein Gerät kann sein Modell als Zeichenkette und seine verfügbaren Anschlüsse als Liste enthalten.
Deduplizierung
Die Deduplizierung entfernt wiederholte Vorkommen und lässt einen Vertreter jedes unterschiedlichen Werts übrig; die Reihenfolge bleibt nur bei einer geeigneten Methode erhalten.
Die Deduplizierung mit list(dict.fromkeys(items)) bewahrt bei hashbaren Elementen die Reihenfolge ihres ersten Auftretens.
defaultdict
Ein defaultdict ist ein Wörterbuchtyp, der beim Lesen eines fehlenden Schlüssels mit eckigen Klammern mithilfe einer angegebenen Fabrik einen Wert erstellt und speichert.
Ein mit list erstelltes defaultdict beginnt eine separate leere Liste, sobald ein neuer Gruppenschlüssel erstmals gelesen wird.
Dictionary Comprehension
Eine Dictionary Comprehension erstellt ein neues Wörterbuch, indem sie aus einem iterierbaren Objekt Schlüssel-Wert-Paare erzeugt und die Eingaben optional filtert.
Die Dictionary Comprehension {word: len(word) for word in words} speichert unter jedem Wort eine Länge.
Differenzmenge
Die Differenzmenge a - b enthält Elemente der linken Menge, die in der rechten Menge fehlen. Daher ist die Reihenfolge der Operanden wichtig.
Die Differenzmenge required - skills findet Anforderungen, die dem Bewerber fehlen, nicht seine zusätzlichen Fähigkeiten.
discard
Die Mengenmethode discard entfernt ein angegebenes Element, wenn es vorhanden ist, und lässt die Menge unverändert, wenn es fehlt.
Der Aufruf von discard mit blocked.discard(address) erlaubt eine bereits entsperrte Adresse, ohne einen Fehler auszulösen.
disjunkte Mengen
Disjunkte Mengen haben kein gemeinsames Element, sodass ihre Schnittmenge leer ist und der Aufruf a.isdisjoint(b) den Wert True zurückgibt.
Die Mengen der ungeraden und geraden Würfelergebnisse sind disjunkte Mengen, weil kein mögliches Ergebnis zu beiden gehört.

E

echte Teilmenge
Eine echte Teilmenge ist eine Teilmenge, die nicht gleich der enthaltenden Menge ist; diese muss mindestens ein zusätzliches Element haben.
Die Prüfung auf eine echte Teilmenge {2} < {2, 4} ist wahr, während {2} < {2} falsch ist, weil die Mengen gleich sind.
Einfügereihenfolge
Die Einfügereihenfolge ist die Reihenfolge, in der Wörterbuchschlüssel hinzugefügt wurden; sie bleibt beim Durchlaufen oder Anzeigen des Wörterbuchs erhalten.
In der Einfügereihenfolge bleibt "west" vor "east", wenn es zuerst hinzugefügt wurde, selbst wenn sich sein Wert ändert.
Element
Ein Element ist ein Mitglied einer Menge; gleiche Werte zählen als dasselbe Mitglied, auch wenn sie mehrmals übergeben wurden.
Das Element 3 erscheint einmal in set([3, 3, 5]), sodass die entstehende Menge nur zwei Elemente hat.

F

Filter
Ein Filter behält nur Eingaben, die eine Bedingung erfüllen; die abschließende if-Klausel einer Comprehension entscheidet, welche Eingaben Paare erzeugen.
Ein Filter wie if quantity > 0 lässt beim Erstellen eines neuen Wörterbuchs Produkte mit einem Bestand von null weg.
flache Kopie
Eine flache Kopie erstellt eine separate äußere Sammlung und verwendet dabei Referenzen auf die inneren Objekte der ursprünglichen Sammlung weiter.
Eine flache Kopie von Studierendendatensätzen referenziert weiterhin jedes Studierendenwörterbuch gemeinsam, sodass eine Altersänderung beide betrifft.
formatierter Bericht
Ein formatierter Bericht stellt ausgewählte Daten lesbar dar, etwa in einer Zeile pro Datensatz mit einem arithmetischen Mittel auf eine Nachkommastelle.
Ein formatierter Bericht kann f"{name}: {average:.1f}" verwenden, um eine ID und ihr gerundetes arithmetisches Mittel anzuzeigen.
frozenset
Ein frozenset ist eine unveränderliche Menge, die dank ihrer Hashbarkeit als Wörterbuchschlüssel oder als Element einer anderen Menge dienen kann.
Ein frozenset kann eine feste Gruppe von Markierungen darstellen, wenn diese ganze Gruppe als Wörterbuchschlüssel verwendet werden muss.

G

gemeinsam referenzierter veränderlicher Wert
Ein gemeinsam referenzierter veränderlicher Wert ist ein veränderbares Objekt, das an mehreren Stellen gespeichert oder benannt ist, sodass eine Änderung über eine Referenz auch über die anderen sichtbar wird.
Ein gemeinsam referenzierter veränderlicher Wert entsteht, wenn dict.fromkeys(keys, []) eine Liste unter jedem Gruppenschlüssel ablegt.
Gleichheit von Sammlungen
Die Gleichheit von Sammlungen vergleicht Inhalte gemäß dem Sammlungstyp: Listen verlangen eine übereinstimmende Reihenfolge, während Wörterbücher und Mengen die Reihenfolge ignorieren.
Bei der Gleichheit von Sammlungen ist {"a": 1, "b": 2} gleich denselben Paaren, die in umgekehrter Reihenfolge eingefügt wurden.
Gruppierung
Die Gruppierung sammelt Eingaben unter gemeinsamen Kategoriebezeichnungen und ordnet oft jeder Bezeichnung eine Liste aller ihr zugewiesenen Mitglieder zu.
Die Gruppierung von Dateinamen nach ihrem ersten Buchstaben setzt "map" und "memo" in dieselbe Liste für "m".

H

hashbar
Ein Objekt ist hashbar, wenn es als Wörterbuchschlüssel oder Mengenelement dienen kann; dazu gehören Zeichenketten, Zahlen und Tupel aus hashbaren Elementen.
Das Tupel (4, 7) ist hashbar und kann einen Ort in einem Raster bezeichnen, die Liste [4, 7] dagegen nicht.
Häufigkeitstabelle
Eine Häufigkeitstabelle ordnet jedem unterschiedlichen Element die Anzahl seiner Vorkommen zu, oft mithilfe eines Wörterbuchs mit ganzzahligen Zählwerten.
Eine Häufigkeitstabelle für die Würfelergebnisse [2, 5, 2] speichert unter 2 den Zählwert zwei und unter 5 den Zählwert eins.

I

Initialisierung
Die Initialisierung gibt einer Variablen vor der Verarbeitung ihren Anfangswert, etwa ein leeres Wörterbuch vor einer Zählschleife.
Die Initialisierung mit counts = {} innerhalb der Schleife würde die bei früheren Durchläufen gesammelten Zählwerte löschen.
items-Ansicht
Die items-Ansicht liefert Wörterbucheinträge als Schlüssel-Wert-Tupel, sodass eine Schleife beide Teile jedes gespeicherten Paars erhalten kann.
Die items-Ansicht in for city, temp in temps.items(): liefert jede Stadt zusammen mit ihrer Temperatur.
Iteration
Iteration durchläuft die von einer Sammlung gelieferten Elemente, eines pro Schleifendurchlauf; beim direkten Durchlaufen eines Wörterbuchs werden dessen Schlüssel geliefert.
Die Iteration über {"west": 4, "east": 9} durchläuft "west" und dann "east", nicht die gespeicherten Mengen.

K

Kategoriesumme
Eine Kategoriesumme ist die Summe der einer Bezeichnung zugewiesenen Beträge. Sie entsteht, indem jeder neue Betrag zur bisherigen Summe dieser Bezeichnung addiert wird.
Eine Kategoriesumme für Lebensmittel addiert alle Lebensmittelausgaben, auch wenn dazwischen Reisekosten anfallen.
KeyError
Ein KeyError ist eine Ausnahme, die beim Zugriff auf einen fehlenden Wörterbuchschlüssel oder bei bestimmten Entfernungsoperationen für fehlende Schlüssel oder Elemente ausgelöst wird.
Der Ausdruck stock["soap"] löst KeyError aus, wenn im Bestandswörterbuch kein Eintrag für Seife existiert.

L

Liste
Eine Liste ist eine veränderliche, geordnete Sequenz, die wiederholte Werte erlaubt und den Zugriff auf Elemente über ihre Positionen unterstützt.
Eine Liste von Ausleihen bewahrt dieselbe Buch-ID zweimal, wenn das Buch an einem Tag zweimal ausgeliehen wird.

M

Menge
Eine Menge ist eine veränderliche Sammlung eindeutiger, hashbarer Elemente ohne garantierte Reihenfolge, die für Zugehörigkeitsprüfungen und Sammlungsvergleiche verwendet wird.
Eine Menge ausgeliehener Buch-IDs beantwortet, ob eine ID vorhanden ist, ohne einen separaten Wert dafür zu speichern.

N

Nachschlagen
Beim Nachschlagen in einem Wörterbuch wird ein Schlüssel verwendet, um den zugehörigen Wert abzurufen; ein Zugriff mit eckigen Klammern löst einen Fehler aus, wenn der Schlüssel fehlt.
Der Zugriff prices["juice"] ruft den gespeicherten Preis ab, sofern das Wörterbuch den Schlüssel "juice" hat.

O

Obermenge
Eine Obermenge enthält jedes Element einer anderen Menge; a >= b prüft, ob a alle Elemente von b enthält, wobei Gleichheit erlaubt ist.
Die Obermengenprüfung skills >= required prüft, ob der Bewerber alle erforderlichen Fähigkeiten hat.
optionales Feld
Ein optionales Feld kann in manchen Datensätzen fehlen. Das Lesen mit get kann daher einen Ersatzwert liefern, ohne KeyError auszulösen.
Ein optionales Feld für die E-Mail-Adresse kann als "no email" angezeigt werden, wenn ein Studierendendatensatz es nicht enthält.

P

pop
Die Wörterbuchmethode pop entfernt einen angegebenen Schlüssel und gibt seinen gespeicherten Wert zurück; fehlt der Schlüssel, verwendet sie einen angegebenen Standardwert.
Ein Aufruf von inventory.pop("pads") verwendet pop, um die alte Menge zurückzuerhalten und zugleich das Produkt zu entfernen.
popitem
Die Wörterbuchmethode popitem entfernt das zuletzt eingefügte Schlüssel-Wert-Paar und gibt es als Tupel mit zwei Elementen zurück.
Nach dem Hinzufügen der Schlüssel "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
Eine Prüfung auf eine leere Liste prüft, ob eine Liste Werte enthält, bevor eine Operation ausgeführt wird, die diese benötigt, etwa die Division einer Summe durch die Länge der Liste.
Die Prüfung auf eine leere Liste mit if scores: verhindert, dass ein Datensatz ohne Punktzahlen eine Division durch null verursacht.

S

Schlüssel
Ein Schlüssel bezeichnet einen Wert in einem Wörterbuch; über den Schlüssel lässt sich dieser Wert abrufen, ohne die Position des Paars zu benötigen.
Der Schlüssel "glue" ruft die Menge 3 aus einem Wörterbuch ab, das Mengen nach Produktnamen speichert.
Schlüssel-Wert-Paar
Ein Schlüssel-Wert-Paar ist ein Wörterbucheintrag aus einem eindeutigen Schlüssel und seinem zugehörigen Wert; in einem Literal verbindet ein Doppelpunkt die beiden.
Das Schlüssel-Wert-Paar "room": 12 verbindet den Feldnamen "room" mit der Zahl 12.
Schnittmenge
Die Schnittmenge zweier Mengen enthält nur die in beiden vorhandenen Elemente und schließt Elemente aus, die nur in einer Eingabe vorkommen.
Die Schnittmenge der angemeldeten und der bezahlten IDs ermittelt die Personen, die zu beiden Gruppen gehören.
Schnittmenge von Schlüsselansichten
Eine Schnittmenge von Schlüsselansichten entsteht durch Anwendung von & auf Schlüsselansichten von Wörterbüchern und liefert die in beiden Wörterbüchern vorhandenen Schlüssel, ohne ihre Werte zu vergleichen.
Eine Schnittmenge von Schlüsselansichten der Bestandswörterbücher zweier Geschäfte findet Produkte, die beide Geschäfte führen, auch wenn ihre Bestandsmengen unterschiedlich sind.
setdefault
Die Wörterbuchmethode setdefault gibt einen vorhandenen Wert zurück oder fügt bei einem fehlenden Schlüssel zuerst einen Standardwert ein und gibt ihn zurück.
Das Gruppieren mit setdefault erstellt für eine neue Kategorie eine Liste und bewahrt die Liste einer vorhandenen Kategorie.
Standardwert
Ein Standardwert ist ein Ersatzwert für einen fehlenden Zugriff, etwa das zweite Argument der Wörterbuchmethode get.
In stock.get("soap", 0) ist der Standardwert null; der Aufruf erstellt keinen Eintrag für Seife.
Standardwertfabrik
Eine Standardwertfabrik ist die Funktion, die ein defaultdict ohne Argumente aufruft, um beim Zugriff auf einen fehlenden Schlüssel einen Wert zu erstellen.
Die Standardwertfabrik list erstellt für jeden neuen Schlüssel in defaultdict(list) eine neue leere Liste.
symmetrische Differenz
Die symmetrische Differenz enthält Elemente, die in genau einer von zwei Mengen liegen; gemeinsame Elemente werden aus der Vereinigung ausgeschlossen.
Die symmetrische Differenz zweier Vereinslisten enthält Personen, die einem Verein beigetreten sind, aber nicht beiden.

T

Teilmenge
Eine Teilmenge hat die Eigenschaft, dass jedes ihrer Elemente in einer anderen Menge enthalten ist; die Prüfung mit <= erlaubt gleiche Mengen.
Die Teilmengenprüfung required <= skills ist nur erfolgreich, wenn der Bewerber jede erforderliche Fähigkeit hat.
Textnormalisierung
Die Textnormalisierung vereinheitlicht ausgewählte Unterschiede vor der Verarbeitung, etwa durch Kleinschreibung von Wörtern, damit die Groß- und Kleinschreibung ihre Zählwerte nicht trennt.
Die Textnormalisierung kann "Map" und "map" durch Kleinschreibung beider Formen einen gemeinsamen Schlüssel für die Wortzählung geben.
tiefe Kopie
Eine tiefe Kopie kopiert verschachtelte Sammlungen rekursiv und erstellt separate Wörterbücher und Listen, die unabhängig vom Original bearbeitet werden können.
Eine tiefe Kopie ermöglicht einem Programm, neue Punktzahlen in einem kopierten Datensatz auszuprobieren, ohne die ursprüngliche Liste der Punktzahlen zu bearbeiten.
Tupel
Ein Tupel ist eine geordnete Sammlung mit festen Plätzen; seine Elemente können nicht ersetzt werden, ein enthaltenes veränderliches Objekt kann sich jedoch weiterhin ändern.
Ein Tupel wie ("Dune", 1965) hält einen Titel und sein Erscheinungsjahr als ein Paar zusammen.
Tupelentpackung
Die Tupelentpackung weist die Elemente eines Tupels separaten Namen zu, etwa den Schlüssel und Wert eines Wörterbucheintrags.
Die Tupelentpackung in for name, score in scores.items(): macht beide Teile im Schleifenkörper verfügbar.

U

Umkehrung eines Wörterbuchs
Die Umkehrung eines Wörterbuchs vertauscht Schlüssel und Werte; sie benötigt hashbare Werte, und wiederholte Werte werden zu einem einzigen neuen Schlüssel zusammengefasst.
Die Umkehrung bei zwei Namen mit derselben Lieblingsfarbe bewahrt unter dieser Farbe nur den letzten Namen.

V

Veränderung eines Objekts
Eine Veränderung eines Objekts ändert ein vorhandenes Objekt, etwa durch Hinzufügen eines Wörterbuchpaars oder Ersetzen seines Werts, ohne ein Ersatzobjekt zu erstellen.
Die Zuweisung stock["soap"] = 6 ist eine Veränderung des Objekts, die über jeden anderen Namen für dieses Wörterbuch sichtbar ist.
Vereinigungsmenge
Die Vereinigungsmenge zweier Mengen enthält jedes Element, das in einer oder beiden Mengen vorkommt, wobei jedes gleiche Element einmal erscheint.
Die Vereinigungsmenge morning | evening führt alle auf, die an mindestens einer der Veranstaltungen teilnehmen, auch Personen, die beide besuchen.
Vergleichsschlüssel
Ein Vergleichsschlüssel ist der Wert, den die als key= übergebene Funktion erzeugt. Er dient zum Vergleichen von Elementen, während die ursprünglichen Elemente als Ergebnisse erhalten bleiben.
Bei sorted(wait, key=wait.get) ist jede gespeicherte Wartezeit der Vergleichsschlüssel für den zugehörigen Stationsnamen.
verketteter Zugriff
Ein verketteter Zugriff führt mehrere Zugriffe nacheinander aus, jeweils auf das Objekt, das der vorherige Wörterbuch- oder Listenzugriff zurückgegeben hat.
Der verkettete Zugriff devices["d7"]["ports"][0] erreicht einen Datensatz, dessen Anschlussliste und dann den ersten Anschluss.
verschachtelte Schleife
Eine verschachtelte Schleife führt bei jedem Durchlauf einer äußeren Schleife eine innere Schleife aus, etwa um jede Punktzahl in jedem Datensatz zu durchlaufen.
Eine verschachtelte Schleife über Studierende und ihre Noten kann passende Noten über die ganze Klasse hinweg zählen.
verschachteltes Wörterbuch
Ein verschachteltes Wörterbuch enthält ein anderes Wörterbuch als Wert, sodass äußere Schlüssel Datensätze und innere Schlüssel Felder bezeichnen können.
Ein verschachteltes Wörterbuch von Studierenden lässt students["ana"]["major"] ein Feld von Anas Datensatz lesen.

W

Wert
Ein Wert in einem Wörterbuch ist das unter einem Schlüssel gespeicherte Objekt. Er kann eine Zahl, eine Zeichenkette, eine Liste, ein Wörterbuch oder ein beliebiger anderer Datentyp sein.
Der Wert unter "scores" kann eine Liste sein, sodass ein Datensatz alle Punktzahlen eines Lernenden enthält.
Wörterbuch
Ein Wörterbuch ist eine veränderliche Sammlung, die eindeutigen, hashbaren Schlüsseln Werte zuordnet und die Reihenfolge bewahrt, in der die Schlüssel eingefügt wurden.
Ein Wörterbuch kann jedem Produktnamen seine aktuelle Menge zuordnen, zum Beispiel {"tape": 8, "glue": 3}.
Wörterbuchansicht
Eine Wörterbuchansicht ist ein dynamisches Objekt, das von keys(), values() oder items() zurückgegeben wird und Änderungen am Wörterbuch widerspiegelt.
Eine mit stock.keys() gespeicherte Wörterbuchansicht zeigt ein neues Produkt, nachdem es hinzugefügt wurde.

Z

zip
Die Funktion zip verbindet entsprechende Elemente ihrer Eingaben zu Paaren und endet, wenn die kürzeste Eingabe keine weiteren Elemente hat.
Werden Namen und Punktzahlen mit zip gepaart, fehlen nicht zugeordnete Namen, wenn die Liste der Punktzahlen kürzer ist.
Zugehörigkeitsprüfung
Eine Zugehörigkeitsprüfung fragt mit in oder not in, ob eine Sammlung ein Element enthält; bei einem Wörterbuch prüft sie die Schlüssel.
Die Zugehörigkeitsprüfung "soap" in stock bleibt wahr, wenn die gespeicherte Menge an Seife null ist.
Zusammenführen
Das Zusammenführen von Wörterbüchern verbindet Paare zu einem Ergebnis; bei a | b stammen die Werte gemeinsamer Schlüssel aus b und beide Eingaben bleiben unverändert.
Das Zusammenführen mit defaults | overrides lässt eine Überschreibung den Standardwert derselben Einstellung ersetzen.

Über diese Einheit

Von StudeliFehler melden

Erstelle deine eigenen Lernmaterialien

Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.

Jetzt starten