Listen und Tupel in Python

Mit Listen und Tupeln kann ein Python-Programm viele Werte unter einem Namen speichern. Dieses Material zeigt, wie du Listen erstellst, Elemente und Ausschnitte über ihre Position liest, Listen mit Methoden veränderst und mit Schleifen verarbeitest. Dazu gehören auch Tabellen, die als Listen von Listen gespeichert sind. Du lernst Tupel und das Entpacken kennen und erfährst, warum zwei Variablen dieselbe Liste referenzieren können und wie du eine Liste sicher kopierst. Abschließend geht es um das Sortieren mit sort(), sorted() und Schlüsselfunktionen.

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

Was du lernst

  1. Listen erstellen, einzelne Elemente und Ausschnitte über Indizes lesen sowie Listen mit Python-Operatoren und eingebauten Funktionen kombinieren und zusammenfassen.
    • Eine Liste erstellen und ihre Elemente über den Index lesen
      Listenliterale schreiben, Listen mit list() erstellen, ihre Länge mit len() bestimmen, Elemente über positive und negative Indizes lesen und die Zugehörigkeit mit in prüfen.
    • Einen Ausschnitt einer Liste auswählen
      Mit Ausschnitten der Form start:stop:step einen Teil einer Liste auswählen, Ergebnisse bei weggelassenen, negativen oder außerhalb des Bereichs liegenden Werten vorhersagen und einen Ausschnitt von einem einzelnen Element unterscheiden.
    • Listen mit Operatoren und eingebauten Funktionen kombinieren und zusammenfassen
      Listen mit + und * verbinden und wiederholen, Listen vergleichen, Summen, Extremwerte und arithmetische Mittel mit sum(), min() und max() berechnen und zwischen Zeichenketten und Listen umwandeln.
  2. Elemente einer Liste hinzufügen, einfügen, entfernen, finden und ersetzen sowie die Wirkung und den Rückgabewert jeder Methode richtig nutzen.
    • Elemente hinzufügen und entfernen
      Eine Liste mit append(), extend(), insert(), pop(), remove(), del und clear() vergrößern und verkleinern und deren Wirkungen und Rückgabewerte unterscheiden.
    • Elemente finden, zählen und ersetzen
      Werte mit index(), count() und in finden und einzelne Elemente oder ganze Bereiche durch Zuweisung an einen Index oder Ausschnitt ersetzen.
  3. Jedes Element einer Liste mit Schleifen durchlaufen, Muster zum Zählen, Summieren, Suchen, Filtern und Transformieren anwenden und mit Listen von Listen als Tabellen arbeiten.
    • Elemente und Positionen durchlaufen
      Zwischen dem Durchlaufen von Elementen, von Indizes mit range(len()) oder von beidem mit enumerate() und zip() wählen und eine Liste während der Verarbeitung sicher verändern.
    • Gängige Muster zur Listenverarbeitung anwenden
      Elemente einer Liste mit Schleifen summieren, zählen, Extremwerte finden, suchen, filtern und transformieren sowie erkennen, wann eine eingebaute Funktion dieselbe Aufgabe erfüllt.
    • Mit verschachtelten Listen arbeiten
      Eine Tabelle als Liste von Zeilen speichern, Zellen mit zwei Indizes lesen und ändern und jede Zelle mit verschachtelten Schleifen durchlaufen.
  4. Feste Gruppen von Werten in Tupeln speichern, entscheiden, wann ein Tupel besser passt als eine Liste, und Sequenzen in einzelne Variablen entpacken.
    • Tupel erstellen und zwischen Tupeln und Listen wählen
      Tupel einschließlich leerer Tupel und Tupel mit einem Element schreiben, sie über Index und Ausschnitt lesen und erklären, was ihre Unveränderlichkeit erlaubt und verbietet.
    • Werte packen und entpacken
      Mehreren Variablen gleichzeitig Werte aus einem Tupel oder einer Liste zuweisen, zwei Werte tauschen, die übrigen Werte mit einem Namen mit Stern sammeln und mehrere Werte aus einer Funktion zurückgeben.
  5. Vorhersagen, wie sich eine über eine Variable vorgenommene Änderung bei anderen Variablen zeigt, Listen bei Bedarf unabhängig kopieren und Listen ohne Überraschungen an Funktionen übergeben.
    • Namen, Objekte und Aliase unterscheiden
      Erklären, dass Variablen Objekte referenzieren, erkennen, wann zwei Namen dieselbe Liste referenzieren, und Identität (is) von Gleichheit (==) sowie die Veränderung eines Objekts von einer Neubindung unterscheiden.
    • Listen kopieren und gemeinsam referenzierte innere Listen vermeiden
      Mit einem Ausschnitt, list() oder copy() eine unabhängige Kopie erstellen, erkennen, wann eine flache Kopie weiterhin verschachtelte Listen gemeinsam referenziert, und bei Bedarf eine tiefe Kopie verwenden.
    • Listen an Funktionen übergeben und zurückgeben
      Vorhersagen, wann eine Funktion die Liste des aufrufenden Codes verändert, zwischen einer direkten Änderung und der Rückgabe einer neuen Liste wählen und ein veränderliches Standardargument vermeiden.
  6. Daten mit sort() und sorted() aufsteigend oder absteigend ordnen und die Reihenfolge mit Schlüsselfunktionen und dem Vergleich von Tupeln steuern.
    • Mit sort() und sorted() sortieren
      Zwischen dem direkten Sortieren einer Liste und dem Erstellen einer sortierten Kopie wählen, absteigend sortieren, das Umkehren der Reihenfolge vom Sortieren unterscheiden und die Reihenfolge von Zahlen und Zeichenketten vorhersagen.
    • Nach einem Schlüssel sortieren und Datensätze sortieren
      Nach einem berechneten Schlüssel wie Länge oder kleingeschriebenem Text sortieren, Listen von Tupeln nach einem oder mehreren Feldern sortieren und nutzen, dass Python stabil sortiert.

Listen und Tupel in Python einfach erklärt

6 Kapitel

1

Listen erstellen und lesen

Eine Liste bietet einem Programm einen Ort für eine geordnete Sammlung, etwa von Punktzahlen oder Namen. Über Positionen kannst du auf ein bestimmtes Element zugreifen, mit Ausschnitten eine Folge von Elementen auswählen oder die Liste nach einem Muster durchlaufen. Beim Erstellen, Lesen und Kombinieren von Listen entstehen verschiedene Ergebnisarten: ein einzelnes Element, eine neue Liste, eine Zahl oder eine Zeichenkette. Wenn du diese Ergebnisse verfolgst, fällt es leichter, die nächste Operation zu wählen und einen Fehler an einer Grenze zu erkennen.

1.1 Eine Liste erstellen und eine Position lesen

Eine Liste speichert Werte in einer gewählten Reihenfolge. Schreibe die Elemente zwischen eckige Klammern und setze Kommas dazwischen. Jedes Element hat eine Position, sodass wiederholte Werte dennoch getrennte Plätze belegen.

Eine Liste erstellen und ihre Länge bestimmen
scores = [88, 92, 75]
print(scores)
print(len(scores))

Ausgabe:

[88, 92, 75]
3

len() zählt Elemente, nicht den größten Wert oder die letzte Position. Listen können gemischte Datentypen enthalten, wie in [3, "three", 3.0, True], auch wenn es die Verarbeitung meist erleichtert, zusammengehörige Daten gemeinsam zu speichern. Sowohl [] als auch list() erstellen eine leere Liste. Ihre Länge ist 0, und sie kann wachsen, während das Programm Werte sammelt.

list() kann auch die Elemente eines iterierbaren Objekts sammeln, also eines Objekts, das eine for-Schleife durchlaufen kann. list(range(4)) ergibt [0, 1, 2, 3]. list("cat") ergibt ['c', 'a', 't']: Die Zeichenkette liefert jeweils ein Zeichen. Das Ergebnis ist eine neue Liste.

Positionen ab null zählen

Ein Index bezeichnet eine Position. Python beginnt bei 0, daher haben die drei Punktzahlen die Indizes 0, 1 und 2.

AusdruckErgebnisPosition
scores[0]88Erste
scores[1]92Zweite
scores[2]75Dritte
scores[-1]75Letzte
scores[-2]92Vorletzte
scores[-3]88Drittletzte

Negative Indizes zählen vom Ende aus rückwärts. Bei einer Liste der Länge n reichen die gültigen Indizes von -n bis n - 1. Das letzte Element ist scores[len(scores) - 1] oder einfacher scores[-1]. -0 ist weiterhin 0; es bezeichnet nicht die letzte Position.

Einen ungültigen Index erkennen

scores[3] löst IndexError aus, weil kein viertes Element existiert. scores[len(scores)] macht denselben Fehler: Die Anzahl ist um eins größer als der letzte nicht negative Index. Eine leere Liste hat keinen gültigen Elementindex, auch nicht -1.

Ein Listenindex muss eine ganze Zahl sein, keine Gleitkommazahl. scores[1.0] löst TypeError aus, obwohl 1,0 einen ganzzahligen Wert hat. / erzeugt eine Gleitkommazahl, daher schlägt auch scores[len(scores) / 2] fehl. Bei dieser Liste mit drei Elementen erzeugt len(scores) // 2 die ganze Zahl 1, und scores[1] ist 92.

Prüfen, ob ein Wert vorkommt

Die Zugehörigkeitsprüfung prüft Werte, keine Positionen:

colors = ["red", "green"]
print("green" in colors)
print("Green" in colors)
print("blue" not in colors)

Ausgabe:

True
False
True

in und not in geben boolesche Werte zurück und funktionieren auch bei leeren Listen. Zeichenkettenvergleiche beachten die Groß- und Kleinschreibung, daher stimmen "Green" und "green" nicht überein. Eine Zugehörigkeitsprüfung ist vor einer Operation nützlich, die einen vorhandenen Wert voraussetzt, etwa beim Entfernen oder beim Ermitteln seiner Position.

Wichtige Erkenntnisse

  • Listen erhalten die Reihenfolge und können wiederholte Werte enthalten.
  • len(values) zählt Elemente; der letzte nicht negative Index ist len(values) - 1.
  • Negative Indizes zählen vom Ende aus, beginnend bei -1.
  • Ein ungültiger Elementindex löst IndexError aus; eine Gleitkommazahl als Index löst TypeError aus.
  • in prüft, ob ein gleicher Wert in der Liste vorkommt.

1.2 Einen Ausschnitt einer Sequenz auswählen

Ein Ausschnitt wählt eine Folge von Elementen aus und gibt eine neue Sequenz zurück. Bei einer Liste ist das Ergebnis eine weitere Liste, auch wenn sie nur ein Element oder keine Elemente enthält.

Den Startwert einschließen und die Endgrenze ausschließen
letters = ["a", "b", "c", "d", "e", "f"]
print(letters[1:4])

Ausgabe:

['b', 'c', 'd']

Ausgewählt werden die Positionen 1, 2 und 3. Position 4 ist die ausgeschlossene Endgrenze, daher bleibt 'e' außen vor. Bei Schrittweite 1 und Grenzen, die 0 <= start <= stop <= len(letters) erfüllen, ist die Anzahl der ausgewählten Elemente stop - start. Hier ist sie 3. letters[4:2] ergibt [], weil ein vorwärts gerichteter Ausschnitt eine frühere Endgrenze nicht erreichen kann.

Eine Grenze weglassen
AusschnittBedeutungErgebnis
letters[:2]Erste zwei Elemente['a', 'b']
letters[4:]Von Position 4 bis zum Ende['e', 'f']
letters[:]Alle Elemente in einer neuen Liste['a', 'b', 'c', 'd', 'e', 'f']
letters[-2:]Letzte zwei Elemente['e', 'f']
letters[:-1]Alle außer dem letzten['a', 'b', 'c', 'd', 'e']

Negative Grenzen zählen wie negative Indizes vom Ende aus. letters[:n] und letters[n:] teilen die Liste an einer Grenze. Das Zusammenfügen dieser beiden Ausschnitte stellt ihren Inhalt in der ursprünglichen Reihenfolge wieder her.

Die Schrittweite steuern

Die vollständige Form ist values[start:stop:step]. Bei Schrittweite 2 wird eine Position ausgewählt, eine übersprungen und die nächste ausgewählt. letters[::2] ergibt ['a', 'c', 'e'], während letters[1::2] gleich ['b', 'd', 'f'] ist.

Eine negative Schrittweite läuft rückwärts. letters[::-1] beginnt beim letzten Element und ergibt ['f', 'e', 'd', 'c', 'b', 'a']. Bei einem begrenzten rückwärts gerichteten Ausschnitt durchläuft letters[4:1:-1] die Indizes 4, 3 und 2 und ergibt ['e', 'd', 'c']; die Endgrenze bleibt ausgeschlossen. Eine Schrittweite von 0 löst ValueError aus, weil damit keine andere Position erreicht werden kann.

Eine Grenze von einer Position unterscheiden

Ausschnittsgrenzen dürfen über beide Enden hinausreichen. Python begrenzt sie auf die Enden: letters[4:100] ist ['e', 'f'] und letters[10:] ist []. Diese Ausschnitte lösen keinen IndexError aus. Das Lesen des einzelnen Elements letters[10] dagegen schon.

letters[2] ist die Zeichenkette 'c'. letters[2:3] ist die Liste ['c']. Der Doppelpunkt verändert die Art des Ergebnisses. Das ist wichtig, wenn späterer Code eine Zeichenkette oder eine Liste erwartet.

Mit dem Ergebnis arbeiten

Nach first_three = letters[:3] ändert die Zuweisung first_three[0] = "z" nur diese neue äußere Liste; letters[0] bleibt 'a'. Ein vollständiger Ausschnitt ist eine flache Kopie, sodass verschachtelte veränderliche Elemente weiterhin gemeinsam referenziert werden können.

Für Zeichenketten und Tupel gelten dieselben Regeln für Grenzen und Schrittweite. Das Ergebnis behält den Datentyp der ursprünglichen Sequenz: "python"[1:4] ergibt 'yth' und (10, 20, 30)[1:] ergibt (20, 30).

Wichtige Erkenntnisse

  • Ein Ausschnitt schließt seinen Startwert ein und seine Endgrenze aus.
  • Weggelassene Grenzen wählen bis zum jeweiligen Ende der Sequenz aus.
  • Die Schrittweite steuert Richtung und Abstand; null ist ungültig.
  • Ausschnittsgrenzen außerhalb des Bereichs werden auf die Enden begrenzt.
  • Der Zugriff auf ein Element gibt ein Element zurück; ein Ausschnitt gibt eine Sequenz zurück.
  • Ein Listenausschnitt erstellt eine neue äußere Liste.

1.3 Werte kombinieren und zusammenfassende Werte berechnen

Listen unterstützen Operatoren zum Erstellen von Sequenzen und Funktionen zum Zusammenfassen ihrer Werte. Prüfe, ob eine Operation eine neue Liste erstellt, eine Zahl erzeugt oder Text zurückgibt: Diese Ergebnisse erfüllen unterschiedliche Aufgaben.

Listen verbinden oder wiederholen

+ verbindet zwei Listen und erstellt eine neue Liste. [1, 2] + [3] ergibt [1, 2, 3], ohne eine der beiden Eingaben zu verändern. Beide Operanden müssen Listen sein: [1, 2] + 3 löst TypeError aus. Setze bei der Verwendung von + einen einzelnen zusätzlichen Wert in eine Liste mit einem Element.

* wiederholt die Sequenz. [0] * 4 ergibt [0, 0, 0, 0] und ["ab", "cd"] * 2 ergibt ['ab', 'cd', 'ab', 'cd']. Der Operator wiederholt Elemente, nicht die Zeichen innerhalb jeder Zeichenkette. Eine Wiederholungsanzahl von null oder weniger ergibt []. counts = [0] * 7 stellt sieben Zähler für den Anfang bereit. Das Wiederholen einer inneren Liste führt dazu, dass sie an mehreren Positionen referenziert wird. Das ist wichtig, wenn diese Zeilen später verändert werden.

Summe, Extremwerte und arithmetisches Mittel
AusdruckErgebnis
sum([4, 8, 15])27
min([4, 8, 15])4
max([4, 8, 15])15
sum([])0

sum() addiert Zahlen. Die Funktion fügt keine Zeichenketten zusammen; sum(["a", "b"]) löst TypeError aus. min() und max() finden das kleinste und das größte Element. Die Elemente müssen daher miteinander vergleichbar sein. Listen, die nur Zeichenketten enthalten, funktionieren: max(["pear", "apple"]) ergibt aufgrund der Zeichen für Zeichen bestimmten Reihenfolge den Wert 'pear'. Eine leere Liste hat weder Minimum noch Maximum und löst bei beiden Aufrufen ValueError aus.

Das arithmetische Mittel ist die Summe geteilt durch die Anzahl der Elemente:

temps = [18.5, 21.0, 19.5, 23.0]
if temps:
    total = sum(temps)
    mean = total / len(temps)
    print(total, mean)

Ausgabe:

82.0 20.5

Die Bedingung funktioniert, weil leere Listen als falsch und nicht leere Listen als wahr ausgewertet werden. Ohne die Schutzbedingung würde die Berechnung des arithmetischen Mittels von [] durch null dividieren und ZeroDivisionError auslösen. Entscheide, was das Programm tun soll, wenn keine Messwerte vorliegen, etwa None zurückgeben.

Sequenzen in ihrer Reihenfolge vergleichen

== prüft, ob gleiche Elemente an gleichen Positionen stehen. [1, 2, 3] == [1, 2, 3] ist True; [1, 2, 3] == [3, 2, 1] ist False.

Vergleiche bei < und > von links und stoppe beim ersten ungleichen Paar. [2, 9] < [3, 0] ist True, weil 2 kleiner als 3 ist. Die 9 und die 0 entscheiden nichts. Wenn eine Liste den Anfang einer anderen bildet, kommt die kürzere zuerst: [2] < [2, 0] ist True.

Zwischen Text und Listen wechseln
colors = "red,green,blue".split(",")
print(colors)
print(", ".join(["red", "green"]))

Ausgabe:

['red', 'green', 'blue']
red, green

split() teilt eine Zeichenkette an ihrem Trennzeichen. join() wird auf dem Trennzeichen aufgerufen und setzt es zwischen die übergebenen Zeichenketten. Jedes Element muss eine Zeichenkette sein. Um Zahlen zusammenzufügen, erstelle zunächst eine Liste ihrer str()-Ergebnisse; die direkte Übergabe von [1, 2] an join() löst TypeError aus.

Wichtige Erkenntnisse

  • + verbindet Listen; * wiederholt ihre Folge von Elementen.
  • sum, min und max erzeugen zusammenfassende Werte.
  • Prüfe vor der Berechnung eines arithmetischen Mittels oder Extremwerts, ob die Liste leer ist.
  • Der Vergleich von Sequenzen berücksichtigt die Reihenfolge der Elemente und das erste ungleiche Paar.
  • split erzeugt Textteile; join auf einem Trennzeichen fügt Zeichenketten zusammen.
2

Eine Liste verändern

Eine Einkaufsliste wächst, eine Warteschlange verliert ihr erstes Element und ein erfasster Preis muss korrigiert werden. Python bietet Listenmethoden und Zuweisungen für diese Änderungen. Die Wahl hängt davon ab, ob du einen Wert oder eine Position kennst, ob du ein Element oder mehrere brauchst und ob du ein entferntes Element behalten musst. Achtest du auf den Rückgabewert einer Methode, verhinderst du, dass eine Listenänderung den Namen der Liste versehentlich an None bindet.

2.1 Listenelemente hinzufügen und entfernen

Listen sind veränderlich: Ein Programm kann ihren Inhalt nach der Erstellung ändern. Eine Methode gehört zu einem Objekt und wird mit einem Punkt aufgerufen, wie in cart.append("eggs"). Ihre Wirkung auf die Liste und ihr Rückgabewert sind zwei verschiedene Dinge.

Ein Element oder mehrere hinzufügen
cart = ["milk"]
cart.append("eggs")
cart.extend(["tea", "jam"])
print(cart)

Ausgabe:

['milk', 'eggs', 'tea', 'jam']

append(x) fügt genau ein Element am Ende hinzu. Ist x eine Liste, wird diese ganze Liste zu einem verschachtelten Element. Ausgehend von ['milk', 'eggs'] erzeugt cart.append(["tea", "jam"]) die Liste ['milk', 'eggs', ['tea', 'jam']] der Länge 3.

extend(iterable) fügt die vom iterierbaren Objekt gelieferten Elemente einzeln hinzu. Das Erweitern mit ["tea", "jam"] bringt den Einkaufswagen auf die Länge 4. Das Erweitern mit "ab" fügt 'a' und 'b' einzeln hinzu; hänge die Zeichenkette an, um 'ab' als ein Element zu behalten.

insert(i, x) fügt ein Element vor der aktuellen Position i ein. Nach nums = [10, 30] und nums.insert(1, 20) ist die Liste [10, 20, 30]. Spätere Elemente werden nach rechts verschoben. insert(0, x) fügt vorne ein; ein Index hinter dem Ende fügt am Ende ein, ohne einen Indexfehler auszulösen.

Nach Position oder Wert entfernen
OperationVerwendetGibt zurück
items.pop()Letzte PositionEntferntes Element
items.pop(i)Position iEntferntes Element
items.remove(x)Erster Wert gleich xNone
del items[i]Position iKeinen Rückgabewert
del items[start:stop]Ausschnitt von PositionenKeinen Rückgabewert
items.clear()Ganze ListeNone

Bei nums = [10, 20, 30] speichert last = nums.pop() den Wert 30 und lässt [10, 20] zurück. nums.pop(0) gibt danach 10 zurück und lässt [20] zurück. Bei einer leeren Liste oder ungültigen Position löst pop() IndexError aus.

remove() erhält einen Wert. Bei pets = ["cat", "dog", "cat"] lässt pets.remove("cat") die Liste ['dog', 'cat'] zurück. Nur der erste Treffer verschwindet. Fehlt der Wert, löst remove() ValueError aus. Verwende eine Zugehörigkeitsprüfung, wenn er fehlen könnte. Um jedes 'cat' zu entfernen, verwende:

while "cat" in pets:
    pets.remove("cat")

Bei [5, 0, 7] entfernt remove(0) den Wert 0 und lässt [5, 7] zurück; pop(0) entfernt den Wert an Position 0 und ergibt [0, 7]. Die Bedeutung des Arguments bestimmt die Methode.

del kann einen Bereich löschen: Aus [5, 6, 7, 8] lässt del nums[1] die Liste [5, 7, 8] zurück und del nums[0:2] danach [8]. clear() lässt die bestehende Liste leer zurück.

Den Rückgabewert richtig einordnen

append, extend, insert, remove und clear geben None zurück. Schreibe cart.append("tea") in eine eigene Zeile. Schreibst du cart = cart.append("tea"), referenziert cart den Wert None; ein späteres cart.append("jam") löst AttributeError aus. Speichere ein Methodenergebnis nur, wenn es einen Wert liefert, den das Programm benötigt, wie bei last = cart.pop().

Wichtige Erkenntnisse

  • append fügt ein Element hinzu; extend fügt jedes übergebene Element hinzu.
  • insert fügt vor einer Position ein und verschiebt spätere Elemente.
  • pop entfernt ein Element anhand seiner Position und gibt es zurück.
  • remove löscht den ersten gleichen Wert und schlägt fehl, wenn er fehlt.
  • del löscht Elemente an Positionen oder Ausschnitte; clear leert dieselbe Liste.
  • Methoden wie append geben None zurück. Weise dieses Ergebnis daher nicht wieder der Liste zu.

2.2 Werte finden und Elemente ersetzen

Einen Wert zu finden, ihn zu zählen und ihn zu ersetzen sind unterschiedliche Operationen. Verwende eine Zugehörigkeitsprüfung, wenn du ein Ja-oder-Nein-Ergebnis brauchst, eine Suchmethode, wenn du eine Position brauchst, und eine Zuweisung, wenn du die Liste verändern möchtest.

Die erste passende Position finden
days = ["Mon", "Tue", "Wed", "Tue"]
print(days.index("Tue"))
print(days.index("Tue", 2))
print(days.count("Tue"))
print(days.count("Sun"))

Ausgabe:

1
3
2
0

index(x) gibt die erste Position zurück, die einen Wert gleich x enthält. Das optionale Startargument teilt Python mit, wo die Suche beginnen soll. days.index("Tue", 2) überspringt den Treffer an Position 1 und findet den an Position 3. Das Ergebnis bleibt ein Index in der ganzen Liste und zählt nicht ab dem neuen Startpunkt.

index() löst ValueError aus, wenn der Wert fehlt. Listen haben keine find()-Methode, die -1 zurückgibt. Wenn ein Wert fehlen könnte, prüfe zuerst die Zugehörigkeit:

if "Sun" in days:
    position = days.index("Sun")
    print(position)

Dieser Code gibt nichts aus, weil 'Sun' fehlt. count(x) kann ohne diese Schutzbedingung verwendet werden: Die Methode gibt 0 zurück, wenn es keine Treffer gibt. Diese Operationen prüfen auf Gleichheit, daher ist [1, 2.0].count(2) gleich 1. Bei Text wird weiterhin die Groß- und Kleinschreibung beachtet: 'tue' ist nicht gleich 'Tue'.

Ein vorhandenes Element ersetzen
prices = [4.5, 3.0, 7.25]
prices[1] = 3.5
print(prices)

Ausgabe:

[4.5, 3.5, 7.25]

Der alte zweite Wert wird überschrieben und die Länge bleibt 3. Der Index muss existieren: prices[3] = 1.0 löst IndexError aus. Um am Ende etwas hinzuzufügen, verwende append().

AnweisungWirkung auf [10, 20]
nums[0] = 99[99, 20]
nums.insert(0, 99)[99, 10, 20]

Das Ersetzen nutzt einen vorhandenen Platz. Das Einfügen erstellt einen zusätzlichen Platz vor der ausgewählten Position.

Einen Bereich durch Ausschnittszuweisung ersetzen
nums = [1, 2, 3, 4, 5]
nums[1:3] = [20, 30, 40]
print(nums)
nums[0:2] = []
print(nums)

Ausgabe:

[1, 20, 30, 40, 4, 5]
[30, 40, 4, 5]

Die erste Zuweisung ersetzt die zwei Elemente an den Indizes 1 und 2 durch drei neue Elemente und verlängert die Liste um eins. Ein gewöhnlicher zusammenhängender Ausschnitt kann durch eine kürzere oder längere Sequenz ersetzt werden. Die Zuweisung von [] löscht den ausgewählten Bereich. Dies verändert die ursprüngliche Liste; es ist etwas anderes, als einen Ausschnitt in eine neue Variable einzulesen.

Text durch Erstellen von neuem Text bearbeiten

Eine Zeichenkette ist unveränderlich, daher löst word = "cat" gefolgt von word[0] = "b" TypeError aus. Erstelle mit word = "b" + word[1:] eine neue Zeichenkette oder erstelle eine Liste von Zeichen, ändere sie und füge sie zusammen:

letters = list("cat")
letters[0] = "b"
word = "".join(letters)
print(word)

Ausgabe:

bat

Wichtige Erkenntnisse

  • index gibt die erste passende Position zurück und löst bei einem fehlenden Wert ValueError aus.
  • count gibt die Anzahl gleicher Elemente zurück, auch null.
  • Eine Elementzuweisung ersetzt einen bereits vorhandenen Platz.
  • Eine Zuweisung an einen zusammenhängenden Ausschnitt kann die Länge einer Liste ändern.
  • Zeichenketten müssen neu erstellt werden, statt sie durch Elementzuweisung zu verändern.
3

Listen mit Schleifen verarbeiten

Schleifen machen aus einer gespeicherten Sammlung nützliche Ergebnisse: eine Summe, eine passende Position, eine gefilterte Liste oder eine veränderte Tabelle. Bei jeder Aufgabe entscheidest du zuerst, was du durch die Schleife mitführen willst und welche Informationen die Schleife von jedem Element braucht. Manche Aufgaben benötigen nur Werte, andere Positionen oder gepaarte Datensätze. Verschachtelte Listen fügen eine weitere Ebene hinzu. Um eine Tabelle zu verarbeiten, durchläufst du daher ihre Zeilen und anschließend deren Zellen.

3.1 Elemente und Positionen durchlaufen

Eine Schleife kann die Werte einer Liste, ihre Positionen oder beides nutzen. Wähle die Form, die liefert, was der Schleifenkörper benötigt. Prüfe bei einer Änderung der Liste auch, ob die Anweisung ein Element verändert oder nur einen lokalen Namen neu bindet.

Elemente direkt verwenden
for name in ["Ana", "Ben"]:
    print("Hi", name)

Ausgabe:

Hi Ana
Hi Ben

Die Schleife durchläuft jedes Element der Reihe nach. Bei jedem Durchlauf referenziert name das aktuelle Element. Weist du name einen anderen Wert zu, ersetzt das dieses Element in der Liste nicht. In for r in readings: r = 0 ändert sich nur der Name r.

Positionen zum Ersetzen von Elementen verwenden
readings = [3, -1, 4, -5]
for i in range(len(readings)):
    if readings[i] < 0:
        readings[i] = 0
print(readings)

Ausgabe:

[3, 0, 4, 0]

range(len(readings)) liefert 0, 1, 2 und 3. Bei Index 1 ist die Bedingung wahr, daher ersetzt die Elementzuweisung -1. Bei Index 3 ersetzt sie -5. Positive Messwerte behalten ihre Werte. Mit range(len(readings) + 1) würde auch der nicht vorhandene Index 4 erreicht.

Position und Element zusammen erhalten

enumerate() liefert Paare. Entpacke jedes Paar im Kopf der Schleife:

for i, name in enumerate(["Ana", "Ben"]):
    print(i, name)

Ausgabe:

0 Ana
1 Ben

enumerate(names, start=1) liefert für eine nummerierte Anzeige Beschriftungen ab 1. Diese Beschriftungen sind nicht mehr die bei null beginnenden Indizes der Liste. Um die Liste vom letzten bis zum ersten Element zu durchlaufen, ohne sie zu verändern, verwende for item in reversed(names):. Für rückwärts laufende Indizes verwende range(len(names) - 1, -1, -1); eine Liste mit drei Elementen ergibt 2, 1, 0.

Zwei Listen paarweise verknüpfen
names = ["Ana", "Ben"]
scores = [90, 85]
for name, score in zip(names, scores):
    print(name, score)

Ausgabe:

Ana 90
Ben 85

zip() bildet Paare aus Elementen an entsprechenden Positionen und stoppt bei der kürzeren Eingabe. Wenn jeder Datensatz wichtig ist, prüfe vorher die Längen, bevor du dich darauf verlässt; ein letzter Name ohne Gegenstück wird sonst übersprungen.

Einen Index mit while steuern

Eine while-Schleife braucht einen Startindex, eine Prüfung der Grenze und eine Schrittweite:

i = 0
while i < len(readings):
    print(readings[i])
    i += 1

Wird das Inkrement vergessen, endet diese Schleife nicht. Mit <= wird len(readings) erreicht und IndexError ausgelöst.

Das Verschieben von Elementen während einer for-Schleife vermeiden

Das Entfernen von Elementen verändert die Positionen der nachfolgenden Elemente. Entfernst du bei [1, 2, 2, 3] beim Durchlaufen derselben Liste jede angetroffene 2, bleibt [1, 2, 3] übrig: Die zweite 2 rückt an die gerade durchlaufene Position. Durchlaufe nums[:], wenn die ursprüngliche Liste durch das Entfernen verändert werden muss, oder erstelle eine neue Liste mit den Elementen, die bleiben sollen. Auch das Hinzufügen von Elementen zu der durchlaufenen Liste kann zu unerwartetem Verhalten der Schleife führen.

Wichtige Erkenntnisse

  • Verwende eine direkte Schleife für Elemente, range(len(...)) für Positionen und enumerate für beides.
  • Die Neubindung der Schleifenvariable ersetzt kein Listenelement.
  • zip stoppt bei der kürzeren Eingabe.
  • reversed durchläuft rückwärts, ohne die Liste zu verändern.
  • Eine while-Schleife muss ihren Index weiterzählen und vor len(values) stoppen.
  • Erstelle eine neue Liste oder durchlaufe beim Entfernen von Elementen eine Kopie.

3.2 Summen, Suchen und neue Listen erstellen

Viele Listenprobleme nutzen einige wiederverwendbare Schleifenmuster. Entscheide, welches Ergebnis das Programm braucht, richte es vor der Schleife ein und aktualisiere es, sobald jedes Element ankommt.

Eine Summe oder Anzahl aufsummieren
sales = [120, 75, 205, 50]
total = 0
for sale in sales:
    total += sale
print(total)

Ausgabe:

450

Die laufende Summe nimmt die Werte 120, 195, 400 und 450 an. Stünde total = 0 innerhalb der Schleife, würde bei jedem Durchlauf die vorherige Arbeit gelöscht. sum(sales) berechnet diese Summe direkt.

Ein Zähler addiert für jedes passende Element 1, nicht den Wert des Elements:

scores = [72, 45, 60, 88, 59]
passed = 0
for score in scores:
    if score >= 60:
        passed += 1
print(passed)

Die Ausgabe ist 3: 72, 60 und 88 erfüllen die Bedingung. > 60 würde 2 ergeben, weil genau 60 ausgeschlossen wird. Achte darauf, dass die Formulierung des Schwellenwerts und der Vergleich übereinstimmen.

Einen Extremwert finden

Initialisiere bei einer nicht leeren Liste ein bisheriges Maximum mit einem tatsächlichen Element:

temps = [-3, -8, -1, -5]
highest = temps[0]
for temp in temps[1:]:
    if temp > highest:
        highest = temp
print(highest)

Die Ausgabe ist -1. Ein Start bei 0 würde fälschlich 0 beibehalten, weil alle Messwerte kleiner sind. Verwende <, um das Minimum zu finden, oder nutze die eingebauten Funktionen min() und max(). Prüfe vor dem Zugriff auf das erste Element, ob die Liste leer ist.

Beim ersten Treffer stoppen
values = [4, 0, -2, 5, -7]
position = -1
for i, value in enumerate(values):
    if value < 0:
        position = i
        break
print(position)

Die Ausgabe ist 2. -1 ist ein gewähltes Signal für einen fehlenden Treffer. Verwende es nur dann als Index, wenn die Suche erfolgreich war, denn es ist auch ein gültiger Index für das letzte Element. break erhält die erste passende Position. Ohne diese Anweisung würden spätere Treffer das Ergebnis überschreiben.

x in values prüft auf einen bestimmten exakten Wert, und values.index(x) findet seine erste Position. Eine Bedingung wie „ist negativ“ braucht eine bedingungsbasierte Suche wie die Schleife oben.

Filtern oder transformieren

Ein Filter behält ausgewählte ursprüngliche Elemente:

passing = []
for score in scores:
    if score >= 60:
        passing.append(score)
print(passing)

Die Ausgabe ist [72, 60, 88]; scores behält alle fünf Elemente. Eine Transformation berechnet aus jedem ursprünglichen Element ein neues:

nums = []
for text in ["3", "14", "15"]:
    nums.append(int(text))
print(nums, sum(nums))

Die Ausgabe ist [3, 14, 15] 32. Die Umwandlung geschieht vor der Addition; das Summieren der ursprünglichen Zeichenketten schlägt fehl.

Ein wiederverwendbares Ergebnis zurückgeben
def average(values):
    if not values:
        return None
    return sum(values) / len(values)

average([18.5, 21.0, 19.5, 23.0]) gibt 20.5 zurück. Bei einer leeren Liste wird None zurückgegeben, ohne durch null zu dividieren, und die Funktion lässt die Eingabeliste unverändert.

Wichtige Erkenntnisse

  • Initialisiere einen Akkumulator vor der Schleife.
  • Ein Zähler addiert 1 pro Treffer; eine Summe addiert Werte.
  • Beginne einen laufend ermittelten Extremwert mit einem tatsächlichen Element.
  • Verwende break, um bei einer Suche den ersten Treffer zu behalten.
  • Filtern wählt Elemente aus; Transformieren berechnet neue Werte.
  • Eine Funktion mit Rückgabewert lässt den aufrufenden Code ein Ergebnis behalten, ohne die Eingabe zu verändern.

3.3 Eine Tabelle aus Zeilen lesen und verarbeiten

Eine verschachtelte Liste ist eine Liste, die andere Listen enthält. Eine Tabelle verwendet häufig eine innere Liste pro Zeile. Jeder Zugriff wählt eine Ebene aus, daher braucht das Lesen einer Zelle zwei Indizes.

Erst die Zeile, dann die Zelle auswählen
grid = [[1, 2, 3], [4, 5, 6]]
print(grid[1])
print(grid[1][2])
print(len(grid), len(grid[0]))

Ausgabe:

[4, 5, 6]
6
2 3

grid[1] wählt die zweite Zeile aus; [2] wählt dann das dritte Element dieser Zeile. len(grid) zählt Zeilen, während len(grid[0]) die Zellen der ersten Zeile zählt. Diese rechteckige Tabelle hat sechs Zellen. grid[2][1] schlägt beim ersten Zugriff fehl, weil Zeile 2 nicht existiert. Das Vertauschen von Zeilen- und Spaltenposition kann die falsche Zelle auswählen oder IndexError auslösen.

Eine Zelle oder eine ganze Zeile ändern

grid[0][1] = 20 ändert die zweite Zelle in der ersten Zeile und ergibt [[1, 20, 3], [4, 5, 6]]. grid[0] = [0, 0, 0] ersetzt die gesamte erste Zeile. Die Anzahl der Zugriffe zeigt, welche Ebene ersetzt wird.

Jeden Wert durchlaufen
grid = [[1, 2, 3], [4, 5, 6]]
total = 0
for row in grid:
    for value in row:
        total += value
print(total)

Ausgabe:

21

Die innere Schleife durchläuft die erste Zeile vollständig, bevor die äußere Schleife die zweite Zeile liefert. Sie addiert 1, 2, 3 und dann 4, 5, 6. Für eine Spaltensumme wird aus jeder Zeile eine feste Position verwendet:

column_total = 0
for row in grid:
    column_total += row[1]
print(column_total)

Die Ausgabe ist 7, aus 2 und 5. Dieser Code setzt voraus, dass jede Zeile ein zweites Element hat.

Zeilen müssen nicht gleich lang sein. [[1], [2, 3]] ist eine gültige verschachtelte Liste. Direkte verschachtelte Schleifen durchlaufen dennoch jeden Wert, weil jede innere Schleife ihrer eigenen Zeile folgt. Nähme man an, dass alle Zeilen len(grid[0]) Elemente haben, würden hier Werte übersehen. Um Zellen in einer solchen Tabelle zu zählen, addiere len(row) für jede Zeile.

Unabhängige Zeilen erstellen
table = []
for r in range(3):
    table.append([0] * 4)
table[0][0] = 1
print(table)

Ausgabe:

[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

Jeder Durchlauf erstellt eine neue Liste mit vier Elementen. Die Kurzform [[0] * 4] * 3 wiederholt eine Referenz auf eine Zeile; eine Änderung ihrer ersten Zelle würde in allen drei Zeilen erscheinen.

Datensätze speichern

Eine Zeile kann statt einer Zahlenzeile einen Datensatz beschreiben. Bei students = [["Ana", 90], ["Ben", 85]] ist students[1][0] gleich 'Ben' und students[1][1] gleich 85. Wenn jeder Datensatz zwei Elemente hat, entpackt for name, score in students: sie in aussagekräftig benannte Variablen. Listen von Tupeln können dieselbe Art von Datensätzen darstellen.

Wichtige Erkenntnisse

  • Zwei Indizes wählen erst eine Zeile und dann eine Zelle innerhalb dieser Zeile aus.
  • len(grid) zählt Zeilen; die Zeilenlängen können unterschiedlich sein.
  • Verschachtelte Schleifen verarbeiten jede Zeile mit ihrer eigenen inneren Schleife.
  • Ein Spaltenzugriff setzt voraus, dass die Position in jeder ausgewählten Zeile existiert.
  • Erstelle jede veränderliche Zeile separat, um gemeinsam referenzierte Zellen zu vermeiden.
4

Tupel und Entpacken verwenden

Feste Gruppen von Werten haben oft bedeutungsvolle Positionen: Ein Punkt hat Koordinaten, und ein Ergebnisdatensatz enthält einen Namen und eine Punktzahl. Tupel halten diese Positionen fest, während das Entpacken jedem Wert einen aussagekräftigen Namen gibt. Damit lässt sich auch erklären, wie eine Zuweisung zwei Werte tauschen und eine Funktion mehrere Ergebnisse zurückgeben kann. Ein unveränderliches äußeres Tupel kann weiterhin eine veränderliche Liste enthalten. Achte daher sowohl auf den Container als auch auf die darin enthaltenen Objekte.

4.1 Eine Liste oder ein Tupel wählen

Ein Tupel speichert wie eine Liste Elemente in einer Reihenfolge, aber seine Positionen können nicht ersetzt, hinzugefügt oder entfernt werden. Das ist Unveränderlichkeit. Tupel eignen sich für feste Gruppen wie Koordinaten, Datumsangaben und Datensätze; Listen eignen sich für Sammlungen, die wachsen oder sich ändern.

Ein Tupel erstellen und lesen
point = (3, 4)
date = (2024, 7, 15)
print(date[0])
print(date[1:])
print(len(date))

Ausgabe:

2024
(7, 15)
3

Für die Indizierung von Tupeln, negative Indizes, Ausschnitte und Zugehörigkeitsprüfungen gelten dieselben Regeln wie für Listen. Ein Tupelausschnitt gibt ein Tupel zurück. Du kannst ein Tupel durchlaufen oder +, *, min, max, sum, count und index verwenden, wenn seine Elemente für die Operation geeignet sind.

Das Komma erstellt ein nicht leeres Tupel. t = 3, 4 ergibt auch ohne Klammern (3, 4). Ein Tupel mit einem Element braucht ein abschließendes Komma:

AusdruckWert und Datentyp
(5)Ganze Zahl 5
(5,)Tupel mit einem Element (5,)
()Leeres Tupel
tuple([1, 2])Tupel (1, 2)
tuple("ab")Tupel ('a', 'b')

list(t) wandelt die Elemente eines Tupels in eine veränderliche Liste um.

Verstehen, was sich nicht ändern lässt

point[0] = 5 löst TypeError aus, weil ein Tupel keine Elementzuweisung unterstützt. Tupel haben keine Methoden append, remove oder sort; point.append(5) löst AttributeError aus.

Ein Name kann dennoch an ein neues Tupel gebunden werden:

point = (3, 4)
point = (5,) + point[1:]
print(point)

Die Ausgabe ist (5, 4). Der Ausdruck erstellt ein neues Tupel; er verändert das alte nicht.

Ein Tupel kann ein veränderliches Element enthalten
t = ([1, 2], "x")
t[0].append(3)
print(t)

Ausgabe:

([1, 2, 3], 'x')

Die erste Position enthält weiterhin dieselbe Liste. Der Inhalt dieser Liste hat sich geändert. t[0] = [9] würde das Objekt an dieser Position ersetzen und ist verboten. Die Unveränderlichkeit des äußeren Tupels macht eine innere Liste nicht unveränderlich.

Die Struktur passend zur Aufgabe wählen

Verwende (x, y) für eine Koordinate, (255, 128, 0) für eine RGB-Farbe oder ("Ana", 90) für einen Datensatz mit zwei Feldern. Jede Position hat eine bestimmte Bedeutung. Verwende eine Liste für alle Punktzahlen einer Klasse oder die Artikel eines Einkaufswagens, deren Anzahl wachsen und deren Reihenfolge sich ändern kann. Eine Liste von Tupeln wie [("Ana", 90), ("Ben", 85)] kombiniert eine veränderliche Sammlung mit festen Positionen in den Datensätzen.

Ein Tupel aus Zahlen oder Zeichenketten kann als Wörterbuchschlüssel dienen, wie in {(0, 0): "origin"}. Schlüssel müssen hashbar sein, also Pythons Regeln für das beständige Nachschlagen von Schlüsseln unterstützen. Eine Liste ist nicht hashbar, ebenso wenig ein Tupel, das eine Liste enthält.

Tupel vergleichen

Der Vergleich beginnt links und stoppt beim ersten ungleichen Paar. (1, 2, 5) < (1, 3, 0) ist True: Die ersten Werte sind gleich, und 2 ist kleiner als 3. Nach derselben Regel wird eine Liste von Tupeldatensätzen geordnet, wenn keine Schlüsselfunktion angegeben ist.

Wichtige Erkenntnisse

  • Ein Tupel hat feste Elementpositionen, kann aber ein veränderliches Objekt enthalten.
  • Das Komma macht ein nicht leeres Tupel aus; (5,) enthält ein Element.
  • Für lesende Operationen auf Tupeln gelten die Regeln für Sequenzen.
  • Die Neubindung eines Tupelnamens erzeugt einen anderen Wert, ohne das alte Tupel zu verändern.
  • Tupel, die als Wörterbuchschlüssel verwendet werden, benötigen hashbare Inhalte.
  • Beim Tupelvergleich entscheidet das erste ungleiche Elementpaar.

4.2 Datensätze in Namen entpacken

Beim Packen werden Werte in einem Tupel gesammelt. Das Entpacken weist die Elemente eines iterierbaren Objekts der Reihe nach Namen zu. Zusammen ermöglichen sie es dem Code, den Feldern eines Datensatzes klare Namen zu geben und mehrere Ergebnisse aus einer Funktion zu erhalten.

Namen den Werten zuordnen
record = "Ana", 34, "Lima"
name, age, city = record
print(name, age, city)

Ausgabe:

Ana 34 Lima

Das erste Element wird zu name, das zweite zu age und das dritte zu city. Entpacken funktioniert auch bei Listen und Zeichenketten: first, second = [10, 20] und a, b, c = "xyz" weisen ihre Elemente der Reihe nach zu. user, domain = "ana@example.com".split("@") ergibt 'ana' und 'example.com', weil die Aufteilung zwei Teile erzeugt.

Ohne einen Namen mit Stern muss die Anzahl genau übereinstimmen. x, y = (1, 2, 3) löst wegen zu vieler Werte ValueError aus; x, y, z = (1, 2) löst wegen zu weniger Werte ValueError aus. Python verwirft zusätzliche Elemente nicht stillschweigend.

Werte sicher tauschen
a = 1
b = 2
a, b = b, a
print(a, b)

Die Ausgabe ist 2 1. Python wertet die gesamte rechte Seite mit den alten Werten aus, bevor es einen der beiden Namen links zuweist. Der Versuch mit zwei Anweisungen, a = b gefolgt von b = a, verliert den alten Wert von a und setzt beide Namen auf 2.

Die übrigen Elemente sammeln

Ein Name mit Stern erhält eine Liste der übrigen Werte:

first, *rest = [5, 6, 7, 8]
print(first, rest)
*init, last = [5, 6, 7, 8]
print(init, last)

Ausgabe:

5 [6, 7, 8]
[5, 6, 7] 8

Der Stern kann auch zwischen Namen ohne Stern stehen: first, *middle, last = (5, 6, 7, 8) weist middle die Liste [6, 7] zu. Das gesammelte Objekt ist immer eine Liste, auch beim Entpacken eines Tupels. Bei head, *rest = [5] ist rest gleich []. Für die Namen ohne Stern müssen genügend Elemente vorhanden sein, und im selben Entpackungsmuster ist nur ein Name mit Stern erlaubt.

Während einer Schleife entpacken
for name, score in [("Ana", 90), ("Ben", 85)]:
    print(name, score)

Ausgabe:

Ana 90
Ben 85

Der Schleifenkopf entpackt jeden Datensatz, sobald er ankommt. So funktionieren auch for i, item in enumerate(values): und for a, b in zip(left, right):: Jeder Schleifendurchlauf liefert ein Paar.

Mehrere Ergebnisse zurückgeben
def min_max(values):
    return min(values), max(values)

low, high = min_max([7, 2, 9])
result = min_max([7, 2, 9])
print(low, high)
print(result)

Ausgabe:

2 9
(2, 9)

Die Funktion gibt ein Tupel zurück. Der aufrufende Code kann es entpacken oder das ganze Objekt behalten. Ein Unterstrich bezeichnet üblicherweise einen Wert, den der Code nicht benötigt: _, month, day = (2024, 7, 15) behält Monat und Tag unter beschreibenden Namen. _ bleibt eine gewöhnliche Variable und ist keine besondere Operation zum Verwerfen.

Wichtige Erkenntnisse

  • Packen sammelt Werte; Entpacken weist sie der Reihe nach zu.
  • Ohne Namen mit Stern muss die Anzahl der Elemente genau der Anzahl der Namen entsprechen.
  • Ein Name mit Stern erhält eine Liste der übrigen Werte, die auch leer sein kann.
  • Tausche mit a, b = b, a, um beide alten Werte zu erhalten.
  • Mehrere Rückgabewerte werden üblicherweise in ein Tupel gepackt.
5

Gemeinsame Referenzen verfolgen und Kopien erstellen

Zwei Namen können dieselbe Liste referenzieren, und eine kopierte äußere Liste kann ihre Zeilen weiterhin mit dem Original teilen. Diese Beziehungen erklären, warum eine Änderung manchmal an mehr als einer Stelle erscheint. Verfolge, auf welches Objekt ein Name verweist, bevor du entscheidest, ob eine Operation dieses Objekt verändert oder den Namen neu bindet. Dieselbe Überlegung gilt, wenn eine Funktion eine Liste erhält und wenn ein Standardargument bei mehreren Aufrufen wiederverwendet wird. Durch Kopieren werden die Ebenen unabhängig, bei denen das nötig ist.

5.1 Namen verfolgen, die dieselbe Liste referenzieren

Eine Variable ist ein Name, der ein Objekt referenziert. Eine Zuweisung ändert, worauf ein Name verweist; sie kopiert das Objekt nicht automatisch. Bei einer veränderlichen Liste können daher über zwei Namen dieselben Änderungen sichtbar sein.

Den Referenzen folgen
a = [1, 2, 3]
b = a
b.append(4)
print(a)
print(b)

Ausgabe:

[1, 2, 3, 4]
[1, 2, 3, 4]

Es gibt eine Liste und zwei Namen dafür. b ist ein Alias von a. Das Anhängen verändert das gemeinsam referenzierte Objekt, sodass beim Lesen über beide Namen das hinzugefügte Element erscheint. Zeichne beim Nachvollziehen dieses Codes zwei Pfeile, einen von jedem Namen, zur selben Liste.

Gleichheit und Identität unterscheiden
a = [1, 2]
b = a
c = [1, 2]
print(a == b, a == c)
print(a is b, a is c)

Ausgabe:

True True
True False

== vergleicht Inhalte; is prüft, ob es sich um dasselbe Objekt handelt. c hat den gleichen Inhalt, ist aber eine eigene Liste. id(x) gibt die Identitätsnummer eines Objekts zurück, daher stimmt id(a) == id(b) mit a is b überein. Identitätsnummern zeigen nicht, welche Elemente eine Liste enthält.

Verwende ==, wenn du prüfst, ob Inhalte übereinstimmen. Verwende is, wenn du auf gemeinsame Referenzen oder ein spezielles Objekt wie None prüfst. Ein neues Listenliteral erstellt eine eigene Liste, daher ist a is [1, 2] für eine bestehende Liste a falsch, selbst wenn die Inhalte übereinstimmen.

Veränderung und Neubindung wirken unterschiedlich weit
AnweisungWas ändert sich?Was sieht ein Alias?
b.append(4)Bestehende ListeHinzugefügtes Element
b[0] = 9Bestehende ListeErsetztes Element
b = [7, 8]Der Name bUrsprüngliche Liste unverändert

Nach der letzten Anweisung verweist b auf eine neue Liste. a referenziert weiterhin das ursprüngliche Objekt. Die Neubindung eines Namens lenkt nicht alle Namen um, die einmal dieses Objekt referenziert haben.

+= und + getrennt nachvollziehen

Bei Listen erweitert += die bestehende Liste:

a = [1]
b = a
a += [2]
print(a, b)

Die Ausgabe ist [1, 2] [1, 2]. Dagegen:

a = [1]
b = a
a = a + [2]
print(a, b)

Die Ausgabe ist [1, 2] [1]. + erstellt eine neue Liste, und die Zuweisung lässt a darauf verweisen. b referenziert weiterhin die ursprüngliche Liste mit einem Element.

Weniger sichtbare Aliase suchen

row = [0, 0] gefolgt von table = [row, row] speichert dieselbe Zeile zweimal. table[0][0] = 5 ergibt [[5, 0], [5, 0]], weil beide Positionen auf dieselbe innere Liste verweisen.

Zahlen und Zeichenketten können nicht direkt verändert werden. Nach x = 5, y = x, x += 1 bleibt y gleich 5; x wurde neu gebunden. Auch die Elementpositionen eines Tupels bleiben fest, aber eine innere Liste kann sich ändern. Nach t = ([1], 2), u = t und t[0].append(3) zeigt u den Wert ([1, 3], 2): Beide Namen verweisen weiterhin auf dasselbe Tupel und dieselbe darin enthaltene veränderliche Liste.

Wichtige Erkenntnisse

  • Eine Zuweisung übernimmt eine Referenz; sie kopiert eine Liste nicht.
  • == vergleicht Werte, während is die Objektidentität prüft.
  • Eine Veränderung ist über Aliase sichtbar; eine Neubindung lenkt einen Namen um.
  • Bei Listen verändert += das Objekt, während + eine neue Liste erstellt.
  • Gemeinsame Referenzen können ebenso innerhalb einer Tabelle oder eines Tupels wie zwischen Variablennamen vorkommen.

5.2 Die Ebenen kopieren, die unabhängig sein müssen

Kopieren erstellt ein neues Objekt, aber die Tiefe der Kopie ist entscheidend. Eine neue äußere Liste kann weiterhin Referenzen auf die ursprünglichen inneren Listen enthalten.

Eine neue äußere Liste erstellen
a = [1, 2, 3]
b = a.copy()
b.append(4)
print(a)
print(b)
print(a is b)

Ausgabe:

[1, 2, 3]
[1, 2, 3, 4]
False

a[:], list(a) und a.copy() erstellen jeweils eine flache Kopie einer Liste. Ihr äußerer Container ist neu, und ihre Referenzen auf Elemente werden kopiert. Bei unveränderlichen Zahlen oder Zeichenketten bleibt die andere äußere Liste unverändert, wenn in einer ein Element ersetzt oder hinzugefügt wird.

Erkennen, was eine flache Kopie gemeinsam referenziert
a = [[1, 2], [3, 4]]
b = a.copy()
b[0].append(99)
print(a)
print(b is a, b[0] is a[0])

Ausgabe:

[[1, 2, 99], [3, 4]]
False True

Die beiden äußeren Listen sind verschieden, aber ihre ersten Elemente referenzieren dieselbe innere Liste. append() verändert dieses innere Objekt.

Das Ersetzen einer Position in b ist etwas anderes. Nach b[1] = [0] hat b eine andere zweite Zeile, während a[1] gleich [3, 4] bleibt. Die Zuweisung ändert eine Referenz in der äußeren Liste von b; sie verändert nicht die alte zweite Zeile.

Auch verschachtelte Listen kopieren
import copy

a = [[1, 2], [3, 4]]
b = copy.deepcopy(a)
b[0].append(99)
print(a)
print(b)

Ausgabe:

[[1, 2], [3, 4]]
[[1, 2, 99], [3, 4]]

import copy stellt das Modul zum Kopieren bereit. copy.deepcopy() kopiert die verschachtelte Listenstruktur rekursiv, sodass Änderungen an kopierten inneren Listen das Original nicht erreichen. Verwende die Funktion, wenn Änderungen auf diesen inneren Ebenen unabhängig sein müssen. Eine flache Kopie reicht aus, wenn nur die Reihenfolge oder die Elementreferenzen der äußeren Liste geändert werden.

Wiederholte Referenzen beim Erstellen von Zeilen vermeiden
table = [[0] * 3] * 2
table[0][0] = 7
print(table)

Die Ausgabe ist [[7, 0, 0], [7, 0, 0]]. Die Multiplikation hat die Referenz auf eine Zeile wiederholt. Sie hat keine zwei Zeilen erstellt.

Erstelle jede Zeile innerhalb der Schleife:

table = []
for r in range(2):
    table.append([0] * 3)
table[0][0] = 7
print(table)

Die Ausgabe ist [[7, 0, 0], [0, 0, 0]]. [0] * 3 selbst ist für unabhängige Zähler unproblematisch: Ganze Zahlen können nicht verändert werden, und eine Elementzuweisung ersetzt nur eine Position.

Eine Kopie aus einem bestimmten Grund wählen

Um beim Sortieren die ursprüngliche Reihenfolge zu erhalten, brauchst du eine neue äußere Liste. Sollen ursprüngliche verschachtelte Messwerte erhalten bleiben, während kopierte Zellen geändert werden, brauchst du auch unabhängige innere Listen. Bei rein lesender Verarbeitung ist keine Kopie nötig, und für beabsichtigte gemeinsame Änderungen können Aliase verwendet werden. Um einen Fehler in einer verschachtelten Struktur zu untersuchen, prüfe sowohl b is a als auch b[0] is a[0]; ein Test nur der äußeren Listen übersieht gemeinsam referenzierte innere Listen.

Wichtige Erkenntnisse

  • Ausschnitte, list() und copy() erstellen eine neue äußere Liste.
  • Eine flache Kopie behält Referenzen auf die ursprünglichen Elemente.
  • Das Ersetzen einer kopierten Zeile unterscheidet sich vom Verändern einer gemeinsam referenzierten Zeile.
  • copy.deepcopy kopiert verschachtelte Listen rekursiv.
  • Die Multiplikation verschachtelter Listen wiederholt Referenzen auf eine Zeile.
  • Kopiere nur die Ebenen, deren Änderungen unabhängig sein müssen.

5.3 Die Auswirkungen einer Funktion auf Listen deutlich machen

Ein Funktionsparameter ist ein weiterer Name für das vom aufrufenden Code übergebene Objekt. Ein Listenargument wird nicht automatisch kopiert. Die Funktion kann dieses Objekt verändern, ihren lokalen Parameter neu binden oder ein neues Ergebnis zurückgeben; diese Handlungen wirken sich unterschiedlich auf den aufrufenden Code aus.

Eine Veränderung erreicht den aufrufenden Code
def add_bonus(scores):
    scores.append(5)

marks = [80]
result = add_bonus(marks)
print(marks)
print(result)

Ausgabe:

[80, 5]
None

scores und marks referenzieren zunächst dieselbe Liste. Das Anhängen über scores verändert sie. Da die Funktion keine ausdrückliche return-Anweisung hat, ist ihr Ergebnis None.

Dagegen bindet def reset(scores): scores = [] nur den lokalen Parameter neu. Das marks des aufrufenden Codes referenziert weiterhin seine alte Liste. Verwende scores.clear(), um diese gemeinsam referenzierte Liste tatsächlich zu leeren.

Eine zurückgegebene Liste bei Bedarf behalten

Zwei häufige Entwürfe bestehen darin, eine Liste direkt zu verändern und None zurückzugeben oder sie unverändert zu lassen und eine neue Liste zurückzugeben:

def drop_first(values):
    del values[0]

def tail(values):
    return values[1:]

Bei nums = [1, 2, 3] lässt der Aufruf drop_first(nums) den Wert von nums als [2, 3] zurück. nums = drop_first(nums) würde nums dagegen an None binden. Beginnst du erneut mit [1, 2, 3], weist shorter = tail(nums) der Variablen shorter die Liste [2, 3] zu, während nums unverändert bleibt. Ein Aufruf von tail(nums), ohne das Ergebnis zu behalten, verwirft die neue Liste.

Auch andere Entwürfe sind nützlich: sum() gibt einen zusammenfassenden Wert zurück, und pop() verändert eine Liste und gibt zugleich ein Element zurück. Mache die Wirkung und den Rückgabewert im Namen oder Docstring einer Funktion deutlich.

Ein Ergebnis erstellen, ohne die Eingabe zu verändern
def without_negatives(values):
    kept = []
    for value in values:
        if value >= 0:
            kept.append(value)
    return kept

original = [3, -2, 0, 7]
print(without_negatives(original))
print(original)

Ausgabe:

[3, 0, 7]
[3, -2, 0, 7]

Der aufrufende Code kann seine äußere Liste auch schützen, indem er eine flache Kopie übergibt, etwa mit drop_first(original[:]). Eine Operation, die innere Listen verändert, würde auch auf diesen Ebenen Kopien benötigen.

Einen gemeinsam referenzierten veränderlichen Standardwert vermeiden
def add_item(item, basket=[]):
    basket.append(item)
    return basket

Die Standardliste wird einmal erstellt, wenn die def-Anweisung ausgeführt wird. add_item("a") gibt ['a'] zurück, und der nächste Aufruf mit Standardwert add_item("b") gibt ['a', 'b'] zurück. Verwende None, um eine neue Liste anzufordern:

def add_item(item, basket=None):
    if basket is None:
        basket = []
    basket.append(item)
    return basket

Jeder Aufruf ohne Einkaufswagen erstellt nun eine eigene Liste. Durch Übergabe eines vorhandenen Einkaufswagens sind weiterhin beabsichtigte gemeinsame Änderungen möglich. Eine Funktion kann eine Zahl oder Zeichenkette nicht verändern und keine Positionen eines Tupels ersetzen, sie kann aber eine in einem Tupel gespeicherte Liste verändern, etwa durch den Aufruf pair[0].append(9).

Wichtige Erkenntnisse

  • Ein Parameter referenziert zunächst das Objekt des aufrufenden Codes.
  • Die Veränderung eines Listenparameters ändert dieses Objekt; die Neubindung des Parameters tut das nicht.
  • Behalte eine neu zurückgegebene Liste, wenn das Programm sie benötigt.
  • Prüfe sowohl die Wirkung einer Funktion als auch ihren Rückgabewert.
  • Eine veränderliche Standardliste wird bei Aufrufen mit Standardwert gemeinsam referenziert.
  • Verwende None und erstelle innerhalb der Funktion eine Liste, um einen neuen Standardwert zu erhalten.
6

Sequenzen ordnen

Um Datensätze zu ordnen, sind zwei Entscheidungen nötig: Welche Werte bestimmen die Reihenfolge, und soll die ursprüngliche Sammlung verändert werden? Python kann eine Liste direkt sortieren oder aus einem beliebigen iterierbaren Objekt eine neue Liste zurückgeben. Mit Schlüsselfunktionen kann ein Programm ein Feld, einen berechneten Wert oder mehrere Felder nacheinander vergleichen. Bei gleichen Schlüsseln bleibt die Eingabereihenfolge erhalten. Das macht Gleichstände vorhersehbar und unterstützt das Sortieren nach mehreren Regeln.

6.1 Wählen, wie Daten sortiert oder umgekehrt werden

Sortieren bringt Elemente in eine durch Vergleiche bestimmte Reihenfolge. Das Umkehren dreht ihre aktuelle Reihenfolge um. Entscheide auch, ob das Programm die bestehende Liste verändern oder sie behalten und eine neue Liste erhalten soll.

Direkt sortieren oder eine neue Liste behalten
nums = [3, 1, 2]
new = sorted(nums)
print(nums)
print(new)
nums.sort()
print(nums)

Ausgabe:

[3, 1, 2]
[1, 2, 3]
[1, 2, 3]

sorted() erstellt eine neue Liste. sort() ist eine Listenmethode, die die bestehende Liste umordnet und None zurückgibt. Bei nums = nums.sort() verliert der Name seine Referenz auf die Liste und wird an None gebunden. Schreibe nums.sort() in eine eigene Zeile oder verwende nums = sorted(nums). print(nums.sort()) gibt None aus, obwohl die Liste umgeordnet wurde.

sorted() akzeptiert jedes iterierbare Objekt und gibt immer eine Liste zurück. sorted((3, 1, 2)) ergibt [1, 2, 3] und sorted("cab") ergibt ['a', 'b', 'c']. Zeichenketten und Tupel haben keine sort()-Methode zur direkten Veränderung.

Absteigende und umgekehrte Reihenfolge
Ausdruck für nums = [3, 1, 2]ErgebnisVerändert nums?
sorted(nums, reverse=True)[3, 2, 1]Nein
nums.sort(reverse=True)Gibt None zurück; Liste wird zu [3, 2, 1]Ja
nums[::-1][2, 1, 3]Nein
list(reversed(nums))[2, 1, 3]Nein
nums.reverse()Gibt None zurück; Liste wird zu [2, 1, 3]Ja

Jede Zeile geht von der ursprünglichen Liste aus. reverse=True fordert eine absteigende Vergleichsreihenfolge an und muss namentlich angegeben werden; sorted(nums, True) löst TypeError aus. Das Umkehren durchläuft lediglich die bestehenden Positionen rückwärts und erzeugt daher nicht unbedingt absteigende Werte.

Die verglichenen Werte prüfen

Zahlen werden nach ihrem Zahlenwert sortiert, auch wenn ganze Zahlen und Gleitkommazahlen gemischt sind: sorted([2.5, -1, 2]) ergibt [-1, 2, 2.5].

Text wird Zeichen für Zeichen verglichen. sorted(["10", "9", "100"]) ergibt ['10', '100', '9']. Das erste Zeichen '1' wird vor '9' einsortiert, und eine Zeichenkette, die den Anfang einer längeren bildet, steht vor dieser. Wandle numerische Zeichenketten mit int() oder float() um, wenn eine Sortierung nach Zahlenwert gewünscht ist.

Die Großbuchstaben A–Z werden vor den Kleinbuchstaben a–z einsortiert. sorted(["b", "B", "a"]) ergibt ['B', 'a', 'b']. Die Standardreihenfolge von Zeichenketten beruht auf Zeichencodes; sie ist keine Wörterbuchreihenfolge ohne Beachtung der Groß- und Kleinschreibung.

Alle verglichenen Elemente müssen untereinander < unterstützen. sorted([3, "two", 1]) löst TypeError aus. Bereinige oder wandle die Daten vor dem Sortieren um.

Sortierte Positionen verwenden

Bei einer ungeraden Anzahl von Punktzahlen lässt sich der Wert in der Mitte nach dem Sortieren leicht ablesen:

scores = [72, 95, 64, 88, 79]
ordered = sorted(scores)
median = ordered[len(ordered) // 2]
print(ordered)
print(median)

Die Ausgabe ist [64, 72, 79, 88, 95], gefolgt von 79. Die ursprüngliche Liste hält weiterhin die Reihenfolge fest, in der die Punktzahlen eingetroffen sind. Diese Berechnung anhand eines einzelnen Elements in der Mitte gilt für nicht leere Listen ungerader Länge.

Wichtige Erkenntnisse

  • sort verändert eine Liste und gibt None zurück; sorted gibt eine neue Liste zurück.
  • sorted akzeptiert iterierbare Objekte wie Tupel und Zeichenketten.
  • reverse=True sortiert absteigend; das bloße Umkehren dreht die aktuelle Reihenfolge der Positionen um.
  • Numerische Zeichenketten werden als Text sortiert, solange sie nicht umgewandelt werden.
  • Die Elemente müssen miteinander vergleichbar sein.

6.2 Datensätze nach den entscheidenden Feldern sortieren

Eine Schlüsselfunktion berechnet für jedes Element den Vergleichswert. Die ursprünglichen Elemente bleiben im sortierten Ergebnis unverändert. So kann ein Programm Text nach Länge oder Datensätze nach einem ausgewählten Feld sortieren.

Eine Funktion übergeben, keinen Funktionsaufruf
words = ["kiwi", "fig", "banana"]
print(sorted(words, key=len))

Ausgabe:

['fig', 'kiwi', 'banana']

Python ruft len einmal für jedes Element auf und vergleicht die resultierenden Längen 4, 3 und 6. Übergib key=len ohne Klammern. key=len() versucht, len sofort ohne Argument aufzurufen, und schlägt fehl.

Für den Vergleich in Kleinschreibung verwende key=str.lower. Bei ["banana", "apple", "Cherry"] ist die Standardreihenfolge ['Cherry', 'apple', 'banana']. Mit key=str.lower ist das Ergebnis ['apple', 'banana', 'Cherry']. Das ursprüngliche große C bleibt im Ergebnis erhalten; nur die Vergleichsschlüssel sind kleingeschrieben.

Ein Feld eines Datensatzes auswählen
results = [("Ana", 90), ("Ben", 72), ("Cy", 85)]

def by_score(record):
    return record[1]

print(sorted(results, key=by_score))

Ausgabe:

[('Ben', 72), ('Cy', 85), ('Ana', 90)]

Die Funktion erhält jeweils einen Datensatz. record[1] wählt dessen Punktzahl aus. Ergänze reverse=True, um die höchste Punktzahl an den Anfang zu setzen. results.sort(key=by_score, reverse=True) verwendet dieselbe Regel, verändert aber results selbst.

key=by_score(results) ist anders: Es ruft die Funktion für die ganze Liste auf und übergibt deren Ergebnis als Schlüsselargument. Hier ist dieses Ergebnis das Tupel ('Ben', 72), das nicht als Funktion aufgerufen werden kann, sodass das Sortieren TypeError auslöst.

Mehrere Felder verwenden

Ohne Schlüsselfunktion vergleichen Tupel ihre ersten Elemente und bei gleichen ersten Elementen ihre zweiten. Das Sortieren von [("Ben", 72), ("Ana", 90), ("Ana", 85)] ergibt [('Ana', 85), ('Ana', 90), ('Ben', 72)].

Eine Schlüsselfunktion kann ein Tupel zurückgeben, um eine andere Feldreihenfolge zu wählen:

def rank_key(record):
    return (-record[1], record[0])

results = [("Dee", 85), ("Ana", 90), ("Cy", 85)]
print(sorted(results, key=rank_key))

Ausgabe:

[('Ana', 90), ('Cy', 85), ('Dee', 85)]

Durch das Verneinen der Punktzahl erhalten größere Punktzahlen kleinere Schlüssel. Die Namen lösen dann Gleichstände bei der Punktzahl in aufsteigender Reihenfolge auf. reverse=True bei einem positiven Schlüssel (score, name) würde beide Felder umkehren, auch die Namen, und damit diese Regel mit unterschiedlichen Richtungen nicht erfüllen.

Elemente mit gleichen Schlüsseln in Reihenfolge halten

Python sortiert stabil: Elemente mit gleichen Schlüsseln behalten ihre Eingabereihenfolge. Das Sortieren von ["bb", "a", "cc", "d"] nach len ergibt ['a', 'd', 'bb', 'cc']. Beim Gleichstand zwischen den beiden Wörtern mit einem Buchstaben bleibt 'a' zuerst; beim Gleichstand der Wörter mit zwei Buchstaben bleibt 'bb' zuerst. Stabilität erlaubt auch, zuerst nach einem nachrangigen Feld und dann nach dem Hauptfeld zu sortieren.

min() und max() akzeptieren ebenfalls Schlüsselfunktionen. max(words, key=len) gibt 'banana' zurück, nicht dessen Länge. Bei gleichen Schlüsseln geben diese Funktionen das erste gefundene passende Element zurück.

Wichtige Erkenntnisse

  • Eine Schlüsselfunktion bildet ein Element auf seinen Vergleichswert ab.
  • Übergib die Funktion selbst, etwa key=len oder key=by_score.
  • Die Schlüsselergebnisse steuern die Reihenfolge, ohne die ursprünglichen Elemente zu ersetzen.
  • Ein Tupelschlüssel ordnet nach seinem ersten Feld und nutzt dann spätere Felder, um Gleichstände aufzulösen.
  • Das Verneinen eines numerischen Schlüssels kann allein die Richtung dieses Feldes umkehren.
  • Stabiles Sortieren erhält bei gleichen Schlüsseln die Eingabereihenfolge.
  • min und max geben ursprüngliche Elemente zurück und wählen bei gleichen Schlüsseln das erste.

Listen und Tupel in Python: Beispiele

6 Interaktive Lektionen

1

Lieferzahlen einer Woche lesen

13 Schritte
Eine Liste erstellen, Tage auswählen und ein arithmetisches Mittel sicher berechnen.
  1. 1
    EinführungDie Anzahlen in ihrer Reihenfolge speichern

    Ein Lieferprotokoll speichert pro Tag eine Anzahl. Eine Liste erhält die Reihenfolge, sodass eine Position einen Tag bezeichnet und ein Ausschnitt mehrere Tage auswählt. Aus den ausgewählten Werten kannst du dann eine Summe oder ein arithmetisches Mittel berechnen.

    Arbeite mit deliveries = [12, 7, 15, 9, 17]. Das sind fünf tägliche Anzahlen in der Reihenfolge ihres Eingangs. Verfolge zuerst die Positionen, dann die Ausschnittsgrenzen und schließlich den Ergebnistyp jeder Operation.

  2. 2
    BeispielAnzahlen den Positionen zuordnen

    Die fünf Anzahlen belegen die Indizes 0 bis 4:

    deliveries = [12, 7, 15, 9, 17]
    print(deliveries[0], deliveries[4])
    

    Die Ausgabe ist 12 17. len(deliveries) ist 5, aber Index 5 existiert nicht. Eine Anzahl sagt dir, wie viele Positionen vorhanden sind; sie bezeichnet nicht die letzte. Die letzte Anzahl lässt sich auch mit deliveries[-1] lesen, also mit einem negativen Index vom Ende aus.

  3. 3
    TippEinen Wert vor der Verwendung prüfen

    Die Zugehörigkeitsprüfung beantwortet eine andere Frage als die Indizierung:

    print(9 in deliveries)
    print(4 in deliveries)
    

    Die Ausgabe ist zuerst True, dann False. Der Wert 9 kommt vor, 4 dagegen nicht, obwohl 4 ein gültiger Index ist. in prüft die gespeicherten Werte. Wenn du die Anzahl an Position 4 möchtest, verwende deliveries[4]. Das gibt 17 zurück.

  4. 4
    HerausforderungDie vorletzte Anzahl finden

    Was gibt deliveries[-2] zurück, und würde deliveries[len(deliveries)] funktionieren?

    ---reveal---

    Der negative Index -2 wählt 9 aus, eine Position vor dem letzten Element 17. Der zweite Ausdruck versucht auf Index 5 zuzugreifen und löst IndexError aus. Verwende len(deliveries) - 1 oder -1, um das letzte Element auszuwählen; die Anzahl der Elemente ist um eins größer als der letzte nicht negative Index.

  5. 5
    BeispielDie drei Tage in der Mitte auswählen

    Verwende Index 1 als Startwert und Index 4 als ausgeschlossene Endgrenze:

    middle = deliveries[1:4]
    print(middle)
    

    Die Ausgabe ist [7, 15, 9]. Ausgewählt werden die Positionen 1, 2 und 3. Position 4 enthält 17, bezeichnet hier aber die Endgrenze. middle ist eine neue Liste, sodass Änderungen an ihren äußeren Positionen keine Position in deliveries ersetzen.

  6. 6
    ErklärungEine Grenze weglassen

    deliveries[:2] ergibt [12, 7], die ersten zwei Tage. deliveries[2:] ergibt [15, 9, 17], alle übrigen Tage. Beide Ausschnitte treffen an Grenze 2 aufeinander, sodass ihr Zusammenfügen den ursprünglichen Inhalt wiederherstellt.

    deliveries[-2:] ergibt [9, 17]. Eine negative Grenze zählt vom Ende aus. deliveries[20:] ist []: Eine Ausschnittsgrenze außerhalb des Bereichs wird auf das Ende begrenzt, anders als beim Zugriff auf ein Element außerhalb des Bereichs.

  7. 7
    BeispielJeden zweiten Tag durchlaufen

    Ein drittes Ausschnittsfeld steuert den Abstand:

    print(deliveries[::2])
    print(deliveries[::-1])
    

    Die Ausgabe ist zuerst [12, 15, 17], dann [17, 9, 15, 7, 12]. Die Schrittweite 2 durchläuft die Indizes 0, 2 und 4. Die Schrittweite −1 durchläuft jedes Element rückwärts. Beide Ergebnisse sind neue Listen. Die Schrittweite null kann nicht voranschreiten und löst ValueError aus.

  8. 8
    HerausforderungEine Anzahl von einer Liste unterscheiden

    Welche Werte und Datentypen haben deliveries[2] und deliveries[2:3]?

    ---reveal---

    deliveries[2] ist die ganze Zahl 15. deliveries[2:3] ist die Liste [15]. Der Ausschnitt wählt eine Position aus, gibt aber dennoch eine Liste zurück. Dieser Unterschied ist wichtig, wenn die nächste Operation eine numerische Anzahl erwartet: Die Addition von 1 zur ganzen Zahl funktioniert, während die direkte Addition von 1 zur Liste TypeError auslöst.

  9. 9
    BeispielEin arithmetisches Mittel aus dem Ausschnitt berechnen

    Der Ausschnitt in der Mitte ist [7, 15, 9]. Addiere seine Elemente und dividiere durch seine Länge:

    total = sum(middle)
    mean = total / len(middle)
    print(total)
    print(mean)
    

    Die Ausgabe ist zuerst 31, dann 10.333333333333334. Die Summe ist 7 + 15 + 9 und der Divisor ist 3. / erzeugt ein Gleitkommaergebnis, daher wird dieses arithmetische Mittel als dezimale Näherung angezeigt.

  10. 10
    KernaussageEine Auswahl ohne Tage behandeln

    Ein Ausschnitt kann leer sein, daher braucht die Berechnung eines arithmetischen Mittels eine Schutzbedingung:

    selected = deliveries[20:]
    if selected:
        print(sum(selected) / len(selected))
    else:
        print("No days selected")
    

    Dies gibt No days selected aus. Leere Listen werden als falsch ausgewertet. Obwohl sum([]) gleich 0 ist, würde die Division dieser Summe durch len([]) durch null dividieren. Auch min und max schlagen bei diesen leeren Eingaben fehl.

  11. 11
    VerbindungEine Ausgabezeile erstellen

    Eine Anzeige braucht Zeichenketten, keine Liste ganzer Zahlen:

    pieces = []
    for count in deliveries:
        pieces.append(str(count))
    print(", ".join(pieces))
    

    Die Ausgabe ist 12, 7, 15, 9, 17. join wird auf dem Trennzeichen aufgerufen und setzt es zwischen die Elemente. Die direkte Übergabe der Zahlenliste würde fehlschlagen, weil jedes zusammengefügte Element eine Zeichenkette sein muss. split funktioniert umgekehrt und teilt Text in Zeichenkettenteile.

  12. 12
    HerausforderungAuswählen, summieren und das Original behalten

    Was gibt dieser Code aus?

    selected = deliveries[-3:]
    selected[0] = 0
    print(sum(selected), deliveries[2])
    

    ---reveal---

    Er gibt 26 15 aus. Der Ausschnitt beginnt als [15, 9, 17], dann wird seine erste Position ersetzt und es entsteht [0, 9, 17]. Diese Werte ergeben zusammen 26. Der äußere Ausschnitt ist unabhängig, daher bleibt die ursprüngliche Anzahl an deliveries[2] gleich 15.

  13. 13
    ZusammenfassungDas benötigte Ergebnis wählen

    Lies eine Position für eine einzelne Anzahl, verwende einen Ausschnitt für eine Sequenz und nutze zusammenfassende Funktionen für Summen oder Extremwerte. Ein Listenausschnitt erstellt eine neue äußere Liste.

    Behandle vor der Berechnung eines arithmetischen Mittels den Fall einer leeren Auswahl. Wandle beim Erstellen von Anzeigetext numerische Werte in Zeichenketten um, bevor du sie zusammenfügst.

2

Eine Materialanforderung bearbeiten

10 Schritte
Elemente hinzufügen, entfernen, finden und ersetzen und dabei Methodenergebnisse verfolgen.

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

  1. 1
    EinführungDie Liste und den Rückgabewert verfolgen
  2. 2
    BeispielMehrere Artikel hinzufügen
  3. 3
    BeispielEinen Artikel vorne einfügen
  4. 4
    BeispielEinen abgeholten Artikel entfernen und speichern
  5. 5
    HerausforderungNach einem Wert entfernen
  6. 6
    BeispielDie Position für eine Korrektur finden
  7. 7
    BeispielEinen Artikel durch mehrere ersetzen
  8. 8
    HerausforderungEinen Bereich löschen und einen Wert finden
  9. 9
    HerausforderungDie Anforderung abschließen, ohne sie zu verlieren
  10. 10
    ZusammenfassungDie passende Operation für die Änderung wählen
3

Messwerte bereinigen und eine Tabelle summieren

13 Schritte
Schleifenformen wählen, ein Ergebnis erstellen und Zeilen unterschiedlicher Länge verarbeiten.

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

  1. 1
    EinführungEntscheiden, was jede Schleife mitführt
  2. 2
    ErklärungEinen Wert lesen, ohne seine Position zu bearbeiten
  3. 3
    BeispielUngültige Messwerte über den Index ersetzen
  4. 4
    VerbindungBezeichnungen mit Messwerten paaren
  5. 5
    HerausforderungEin übersprungenes Element erklären
  6. 6
    BeispielDie positiven Messwerte zählen
  7. 7
    BeispielEin gefiltertes und transformiertes Ergebnis erstellen
  8. 8
    TippBis zum ersten Treffer suchen
  9. 9
    HerausforderungEin gültiges Maximum wählen
  10. 10
    BeispielEine Zeile und eine Zelle auswählen
  11. 11
    BeispielAlle Zeilen summieren
  12. 12
    HerausforderungÜber die ganze Tabelle hinweg filtern
  13. 13
    ZusammenfassungDie Vorbereitung von der wiederholten Arbeit trennen
4

Einen festen Datensatz verwenden und seine Felder entpacken

10 Schritte
Tupelpositionen, Entpacken mit Stern, Tauschvorgänge und zurückgegebene Paare nachvollziehen.

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

  1. 1
    EinführungEinen Datensatz zusammenhalten
  2. 2
    BeispielDen Stationsdatensatz erstellen
  3. 3
    KernaussageDie Grenze der Unveränderlichkeit prüfen
  4. 4
    HerausforderungEin Tupel mit einem Element erstellen
  5. 5
    BeispielJedem Feld einen Namen geben
  6. 6
    BeispielDen ersten Messwert und den Rest behalten
  7. 7
    HerausforderungKoordinatenwerte tauschen
  8. 8
    BeispielEin Paar von Extremwerten zurückgeben
  9. 9
    HerausforderungEin ausgewähltes Feld lesen und entpacken
  10. 10
    ZusammenfassungVor dem Entpacken die Struktur lesen
5

Eine kopierte Tabelle durch eine Funktion verfolgen

14 Schritte
Aliase, flache Kopien, tiefe Kopien und Änderungen lokaler Parameter unterscheiden.

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

  1. 1
    EinführungPfade zu Objekten zeichnen
  2. 2
    BeispielEinen Alias erstellen
  3. 3
    BeispielEinen Namen umleiten
  4. 4
    HerausforderungZwei Arten der Addition vorhersagen
  5. 5
    BeispielDie äußere Tabelle kopieren
  6. 6
    BeispielEine gemeinsam referenzierte Zeile verändern
  7. 7
    KernaussageEine kopierte Zeile ersetzen
  8. 8
    HerausforderungEine tiefere Kopie wählen
  9. 9
    BeispielÜber einen Parameter verändern
  10. 10
    VerbindungEine separate Liste zurückgeben
  11. 11
    ErklärungEine dauerhaft gemeinsame Standardliste vermeiden
  12. 12
    HerausforderungLokale Neubindung vom Leeren unterscheiden
  13. 13
    HerausforderungEine an eine Funktion übergebene flache Kopie verfolgen
  14. 14
    ZusammenfassungDie veränderte Ebene verfolgen
6

Datensätze ordnen und ihre Eingangsreihenfolge erhalten

13 Schritte
Eine Kopie sortieren, Schlüssel wählen, Gleichstände auflösen und die Reihenfolge bei gleichen Schlüsseln erhalten.

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

  1. 1
    EinführungGespeicherte Daten von Vergleichsschlüsseln trennen
  2. 2
    BeispielDie Eingangsreihenfolge erhalten
  3. 3
    BeispielUmkehren mit absteigendem Sortieren vergleichen
  4. 4
    TippDen Datentyp der Eingabe prüfen
  5. 5
    HerausforderungEin Sortierergebnis verfolgen
  6. 6
    BeispielEinen Schlüssel für die Punktzahl wählen
  7. 7
    KernaussageDatensätze mit gleichem Schlüssel in Eingangsreihenfolge halten
  8. 8
    HerausforderungEin aufrufbares Objekt übergeben
  9. 9
    BeispielEin alphabetisches Vergleichskriterium für Gleichstände ergänzen
  10. 10
    TippNur die numerische Richtung umkehren
  11. 11
    VerbindungEin Element anhand eines extremen Schlüssels auswählen
  12. 12
    HerausforderungDatensätze und Namen in ihrer ursprünglichen Form behalten
  13. 13
    ZusammenfassungWirkung und Regel wählen

Listen und Tupel in Python: Übungsaufgaben

60 Übungsfragen in 6 Sets

Set 1: Sequenzen lesen, Ausschnitte auswählen und Sequenzen verändern10 Übungsfragen

Frage 1 von 10

Was ist bei levels = [14, 29, 37, 52] der Wert von levels[-2]?
  1. 29
  2. 52
  3. 37
  4. 14
Antwort zeigenAntwort ausblenden
Antwort: C
Ein negativer Index zählt vom Ende aus: -1 wählt 52 und -2 wählt 37 aus. Zwei Positionen vom Anfang aus gezählt ergäben 29, aber das ist eine andere Richtung. Das Minuszeichen ändert, wo die Positionszählung beginnt.

Frage 2 von 10

Was ist bei codes = [2, 5, 8, 11, 14, 17] der Wert von codes[1:5:2]?
  1. [5, 11]
  2. [5, 8, 11, 14]
  3. [5, 11, 17]
  4. [2, 8, 14]
Antwort zeigenAntwort ausblenden
Antwort: A
Der Ausschnitt beginnt bei Index 1 und erreicht als Nächstes Index 3, weil seine Schrittweite 2 ist. Er stoppt vor Index 5, daher ist das Ergebnis [5, 11]. Würde 17 einbezogen, wäre die Endgrenze eingeschlossen; alle Elemente zwischen den Grenzen auszuwählen würde die Schrittweite ignorieren.

Frage 3 von 10

Welche Liste ergibt dieser Code?

items = ["pen"]
items.append(["clip", "pad"])
  1. ['pen', 'clip', 'pad']
  2. [['pen'], ['clip', 'pad']]
  3. ['pen', 'clip pad']
  4. ['pen', ['clip', 'pad']]
Antwort zeigenAntwort ausblenden
Antwort: D
append fügt sein Argument als ein Element hinzu, sodass die beiden Zeichenketten in einer verschachtelten Liste zusammenbleiben. Die äußere Liste hat nun zwei Elemente: eine Zeichenkette und eine Liste. Um die Zeichenketten als separate äußere Elemente hinzuzufügen, wäre extend mit der Liste aus zwei Elementen nötig.

Frage 4 von 10

Was gibt dieser Code aus?

parts = "6|12|18".split("|")
print(len(parts), parts[1])
  1. 8 12
  2. 3 12
  3. 3 6
  4. 8 |
Antwort zeigenAntwort ausblenden
Antwort: B
Das Aufteilen an den zwei Trennzeichen erstellt drei Zeichenkettenelemente: '6', '12' und '18'. Index 1 wählt das zweite Element aus, das als 12 ausgegeben wird. Würdest du stattdessen die Zeichen der ursprünglichen Zeichenkette zählen, würdest du den Eingabetext mit der von split zurückgegebenen Liste verwechseln.

Frage 5 von 10

Was ist nach diesem Code der Wert von len(values)?

values = [4, 7, 10, 13]
values[1:3] = [20, 21, 22]
  1. 4
  2. 5
  3. 6
  4. 3
Antwort zeigenAntwort ausblenden
Antwort: B
Der Ausschnitt wählt zwei vorhandene Elemente an den Indizes 1 und 2 aus und ersetzt sie durch drei Elemente. Die neue Länge ist 4 - 2 + 3, also 5. Die ursprüngliche Länge bliebe bei einer Zuweisung an ein einzelnes Element erhalten, aber das Ersetzen eines zusammenhängenden Ausschnitts kann eine Liste vergrößern oder verkleinern.

Frage 6 von 10

Wie schreibst du ein Tupel, das nur die ganze Zahl 12 enthält?
  1. (12)
  2. [12]
  3. tuple(12)
  4. (12,)
Antwort zeigenAntwort ausblenden
Antwort: D
Ein Tupel mit einem Element braucht ein abschließendes Komma, daher ist (12,) der gesuchte Wert. Runde Klammern allein gruppieren nur die ganze Zahl, sodass (12) dieselbe ganze Zahl wie 12 ist. Eckige Klammern erstellen eine Liste, und tuple(12) schlägt fehl, weil eine ganze Zahl keine iterierbaren Elemente liefern kann.

Frage 7 von 10

Was gibt dieser Code aus?

queue = [18, 0, 24]
removed = queue.pop(0)
print(removed, queue)
  1. 18 [0, 24]
  2. 0 [18, 24]
  3. None [0, 24]
  4. 24 [18, 0]
Antwort zeigenAntwort ausblenden
Antwort: A
pop(0) wählt Position 0 aus, entfernt deren Element 18 und gibt es zurück. Die verbleibende Liste ist [0, 24]. Das Entfernen des Werts 0 würde [18, 24] ergeben, aber das tut remove(0); pop interpretiert sein Argument als Index.

Frage 8 von 10

Was gibt dieser Code aus?

a = [3, 6, 9, 12, 15]
b = a[-4:-1]
print(b[::-1][1])
  1. 6
  2. 12
  3. 9
  4. 15
Antwort zeigenAntwort ausblenden
Antwort: C
Der erste Ausschnitt wählt die Indizes 1 bis 3 aus und ergibt [6, 9, 12]. Das Umkehren dieser neuen Liste ergibt [12, 9, 6], deren Index 1 den Wert 9 enthält. Die Auswahl von 6 würde das erste Element des ursprünglichen Ausschnitts lesen, ohne sowohl das Umkehren als auch den abschließenden Zugriff auszuführen.

Frage 9 von 10

Was geschieht bei items = [9, 16, 25], wenn Python items[len(items)] auswertet?
  1. Der Ausdruck löst IndexError aus.
  2. Der Ausdruck gibt das letzte Element 25 zurück.
  3. Der Ausdruck gibt das erste Element 9 zurück.
  4. Der Ausdruck löst TypeError aus.
Antwort zeigenAntwort ausblenden
Antwort: A
len(items) ist 3, aber die gültigen nicht negativen Indizes sind 0, 1 und 2. Der Zugriff auf Index 3 löst IndexError aus, weil dort kein Element existiert. Der Ausdruck liefert eine ganze Zahl als Index, das Problem ist also dessen Bereich und nicht sein Datentyp; items[-1] würde 25 zurückgeben.

Frage 10 von 10

Was ergibt dieser Vergleich: [4, 99] < [5, 1]?
  1. False, weil das zweite Paar aus 99 und 1 besteht.
  2. False, weil die erste Liste die größere Summe hat.
  3. True, weil beide Listen dieselbe Länge haben.
  4. True, weil das erste ungleiche Paar aus 4 und 5 besteht.
Antwort zeigenAntwort ausblenden
Antwort: D
Beim Ordnen von Sequenzen werden entsprechende Positionen von links nach rechts verglichen. Bereits das erste Paar unterscheidet sich, und 4 < 5 ist wahr, daher endet der Vergleich dort. Die spätere 99 ändert dieses Ergebnis nicht; Python vergleicht bei dieser Operation nicht die Summen der Listen.
Set 2: Werte, Positionen und Tabellen verarbeiten10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Welche Liste gibt dieser Code aus?

values = [8, 3]
for value in values:
    value = 0
print(values)
  1. [0, 0]
  2. [8, 3]
  3. [0, 3]
  4. [8, 0]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Welchen Wert gibt dieser Code aus?

count = 0
for size in [10, 7, 10, 13, 6]:
    if size >= 10:
        count += 1
print(count)
  1. 1
  2. 33
  3. 2
  4. 3
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Was ergibt bei table = [[6, 8, 10], [11, 13, 15]] der Ausdruck table[1][0] + table[0][2]?
  1. 21
  2. 19
  3. 25
  4. 23
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Wie viele Paare enthält list(zip(["Lee", "Mo", "Nia"], [41, 56]))?
  1. 3
  2. 5
  3. 2
  4. 1
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Was wird ausgegeben?

values = [7, -4, -8, 2]
position = -1
for i, value in enumerate(values):
    if value < 0:
        position = i
        break
print(position, values[position])
  1. 2 -8
  2. -1 2
  3. -4 1
  4. 1 -4
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Wie oft wird total += value ausgeführt?

total = 0
for row in [[2, 4], [6], [8, 10, 12]]:
    for value in row:
        total += value
  1. 3
  2. 6
  3. 9
  4. 2
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Welche Liste bleibt nach diesem Code übrig?

values = [0, 0, 1, 0]
for value in values:
    if value == 0:
        values.remove(value)
  1. [1]
  2. [0, 0, 1]
  3. [1, 0]
  4. [0, 1]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Eine Schleife soll den größten Wert in der nicht leeren Liste [-14, -6, -19] finden. Womit sollte ihr bisheriges Maximum initialisiert werden?
  1. Mit dem ersten Element -14.
  2. Mit der Zahl null, 0.
  3. Mit der Länge der Liste, 3.
  4. Mit dem ersten Index 0.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Was gibt dieser Code aus?

kept = []
for text in ["4", "15", "8", "21"]:
    number = int(text)
    if number % 2 == 0:
        kept.append(number + 1)
print(kept)
  1. [4, 8]
  2. [5, 9]
  3. [5, 16, 9, 22]
  4. [16, 22]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Welche Tabelle entsteht?

table = []
for r in range(2):
    table.append([0] * 2)
table[1][0] = 6
  1. [[6, 0], [6, 0]]
  2. [[0, 6], [0, 0]]
  3. [[0, 0], [6, 0]]
  4. [[0, 0], [0, 6]]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 3: Datensätze entpacken und gemeinsam referenzierte Objekte verfolgen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Welchen Wert enthält amount nach label, amount = ("rice", 4)?
  1. 'rice'
  2. (4,)
  3. ('rice', 4)
  4. 4
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Was ist middle nach first, *middle, last = (2, 5, 8, 11, 14)?
  1. (5, 8, 11)
  2. [5, 8, 11]
  3. [2, 5, 8, 11]
  4. [5, 8, 11, 14]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Was gibt dieser Code aus?

a = [5, 8]
b = [5, 8]
print(a == b, a is b)
  1. True True
  2. False True
  3. True False
  4. False False
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Was gibt dieser Code aus?

record = ([2], "ready")
other = record
record[0].append(7)
print(other)
  1. ([2, 7], 'ready')
  2. ([2], 'ready')
  3. ([7], 'ready')
  4. ([2], 'ready', 7)
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Was gibt dieser Code aus?

a = [4]
b = a
a += [9]
a = a + [12]
print(a, b)
  1. [4, 9, 12] [4]
  2. [4, 9, 12] [4, 9, 12]
  3. [4, 9, 12] [4, 9]
  4. [4, 9] [4, 9, 12]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Was gibt dieser Code aus?

def bounds(values):
    return min(values), max(values)

low, high = bounds([18, 5, 12])
low, high = high, low
print(low, high)
  1. 18 5
  2. 5 18
  3. 18 18
  4. 5 5
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Was gibt dieser Code aus?

a = [2, 6]
b = a.copy()
b[0] = 10
print(a, b)
  1. [10, 6] [10, 6]
  2. [2, 6] [2, 6]
  3. [10, 6] [2, 6]
  4. [2, 6] [10, 6]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Ein Programm benötigt einen Wörterbuchschlüssel für Zeile 3 und Spalte 7. Welchen Wert kann es als Koordinatenschlüssel verwenden?
  1. [3, 7]
  2. (3, 7)
  3. ([3], 7)
  4. (3, [7])
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Was gibt dieser Code aus?

a = [[4], [8]]
b = a.copy()
b[0].append(6)
b[1] = [9]
print(a)
  1. [[4], [8]]
  2. [[4, 6], [9]]
  3. [[4], [9]]
  4. [[4, 6], [8]]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Was gibt dieser Code aus?

row = [1, 2]
table = [row, row]
row = [8, 9]
table[0][1] = 7
print(table, row)
  1. [[1, 7], [1, 7]] [8, 9]
  2. [[8, 7], [8, 7]] [8, 7]
  3. [[1, 7], [1, 2]] [8, 9]
  4. [[1, 2], [1, 2]] [8, 7]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 4: Änderungen bei Funktionsaufrufen steuern10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Was gibt bei tags = ["new", "old", "new"] der Ausdruck tags.count("done") zurück?
  1. 0
  2. -1
  3. None
  4. ValueError
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Was gibt dieser Code aus?

def reset(values):
    values = []

values = [11, 22]
reset(values)
print(values)
  1. []
  2. None
  3. [11, 22]
  4. [0, 0]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Was gibt dieser Code aus?

import copy
a = [[3], [7]]
b = copy.deepcopy(a)
b[0].append(5)
print(a, b[0] is a[0])
  1. [[3, 5], [7]] True
  2. [[3], [7]] False
  3. [[3], [7]] True
  4. [[3, 5], [7]] False
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Was gibt die letzte Zeile aus?

def collect(item, items=[]):
    items.append(item)
    return items

first = collect("x")
second = collect("y")
print(first is second, first)
  1. False ['x']
  2. True ['x']
  3. False ['x', 'y']
  4. True ['x', 'y']
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Was gibt dieser Code aus?

def trim(values):
    del values[0]

items = [6, 9, 12]
result = trim(items)
print(items, result)
  1. [9, 12] None
  2. [6, 9, 12] [9, 12]
  3. [9, 12] [9, 12]
  4. None [9, 12]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Was gibt dieser Code aus?

def change(values):
    values.append(8)
    values = [0]
    return values

original = [3]
result = change(original)
print(original, result)
  1. [0] [0]
  2. [3, 8] [0]
  3. [3] [0]
  4. [3, 8] [3, 8]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Welche Tabelle entsteht?

table = [[0] * 2] * 3
table[2][1] = 4
table[0] = [9, 9]
  1. [[9, 9], [0, 0], [0, 4]]
  2. [[9, 9], [9, 9], [9, 9]]
  3. [[0, 4], [0, 4], [0, 4]]
  4. [[9, 9], [0, 4], [0, 4]]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Was ist bei codes = ["q", "r", "q", "s", "q"] der Wert von codes.index("q", 1)?
  1. 0
  2. 1
  3. 2
  4. 4
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Was wird ausgegeben?

def add(item, values=None):
    if values is None:
        values = []
    values.append(item)
    return values

a = add(4)
b = add(7)
c = add(9, a)
print(a, b, c is a)
  1. [4, 7, 9] [4, 7, 9] True
  2. [4] [7] False
  3. [4, 9] [7] True
  4. [4, 9] [7, 9] False
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Was gibt dieser Code aus?

def edit(rows):
    rows[0].append(5)
    rows.append([9])

original = [[1], [2]]
edit(original[:])
print(original)
  1. [[1], [2]]
  2. [[1, 5], [2]]
  3. [[1, 5], [2], [9]]
  4. [[1], [2], [9]]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 5: Sortierregeln wählen und Gleichstände auflösen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Welchen Wert enthält result nach nums = [8, 2, 5] und result = nums.sort()?
  1. [2, 5, 8]
  2. [8, 5, 2]
  3. None
  4. [8, 2, 5]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Was gibt sorted(["20", "3", "11"]) zurück?
  1. ['3', '11', '20']
  2. ['20', '3', '11']
  3. ['3', '20', '11']
  4. ['11', '20', '3']
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Was gibt sorted(["pear", "a", "plum", "to"], key=len) zurück?
  1. ['a', 'to', 'plum', 'pear']
  2. ['a', 'to', 'pear', 'plum']
  3. ['a', 'pear', 'plum', 'to']
  4. ['pear', 'plum', 'to', 'a']
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Welches Ergebnispaar liefern bei values = [6, 1, 4] die Ausdrücke values[::-1] und sorted(values, reverse=True) in dieser Reihenfolge?
  1. [4, 1, 6] und [6, 4, 1]
  2. [6, 4, 1] und [4, 1, 6]
  3. [4, 1, 6] und [4, 1, 6]
  4. [6, 4, 1] und [6, 4, 1]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Datensätze sind Paare der Form (name, score). Welcher Körper einer Schlüsselfunktion ordnet höhere Punktzahlen zuerst und bei gleichen Punktzahlen Namen von A bis Z?
  1. return (record[1], record[0])
  2. return (record[0], -record[1])
  3. return (-record[1], len(record[0]))
  4. return (-record[1], record[0])
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Welche Reihenfolge erzeugt dieser Code?

records = [("Zoe", 8), ("Ali", 8), ("Mia", 6)]
def by_score(record):
    return record[1]
print(sorted(records, key=by_score, reverse=True))
  1. [('Ali', 8), ('Zoe', 8), ('Mia', 6)]
  2. [('Mia', 6), ('Zoe', 8), ('Ali', 8)]
  3. [('Zoe', 8), ('Ali', 8), ('Mia', 6)]
  4. [('Zoe', 8), ('Mia', 6), ('Ali', 8)]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Was gibt dieser Code aus?

words = ["oak", "elm", "pine", "ash"]
print(max(words, key=len), min(words, key=len))
  1. pine oak
  2. pine ash
  3. 4 3
  4. pine elm
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Was gibt dieser Code aus?

words = ["beta", "Alpha", "alpha", "Beta"]
print(sorted(words, key=str.lower))
  1. ['beta', 'Beta', 'Alpha', 'alpha']
  2. ['Alpha', 'alpha', 'beta', 'Beta']
  3. ['Alpha', 'beta', 'alpha', 'Beta']
  4. ['Alpha', 'Beta', 'beta', 'alpha']
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Was gibt dieser Code aus?

a = [9, 4, 7]
b = a
c = sorted(a)
a.reverse()
print(b, c)
  1. [7, 4, 9] [4, 7, 9]
  2. [4, 7, 9] [4, 7, 9]
  3. [9, 4, 7] [4, 7, 9]
  4. [7, 4, 9] [9, 7, 4]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein Programm sortiert Datensätze der Form (name, score) zuerst nach Namen von A bis Z. Danach sortiert es sie stabil nach Punktzahl, von hoch nach niedrig. Wie sind Datensätze mit gleicher Punktzahl in der endgültigen Liste geordnet?
  1. Nach Namen von Z bis A innerhalb jeder Gruppe gleicher Punktzahl.
  2. Nach Namen von A bis Z vor jedem Vergleich der Punktzahlen.
  3. Nach ihrer Reihenfolge vor beiden Sortierungen.
  4. Nach Namen von A bis Z innerhalb jeder Gruppe gleicher Punktzahl.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 6: Fehler in Sequenzoperationen beheben und Operationen kombinieren10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Was ist bei values = [12, 24] der Wert von values[5:20]?
  1. IndexError
  2. []
  3. [24]
  4. [12, 24]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine Zahlenliste kann leer sein. Wie kann eine Funktion ihr arithmetisches Mittel zurückgeben, wenn Werte vorhanden sind, und sonst None?
  1. Prüfe if not values: return None, gib danach sum(values) / len(values) zurück.
  2. Prüfe if not values: return 0, gib danach sum(values) / len(values) zurück.
  3. Gib sum(values) / len(values) zurück, bevor du prüfst, ob die Liste leer ist.
  4. Prüfe if values: return None, gib danach sum(values) / len(values) zurück.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Was gibt dieser Code aus?

items = [1, 2]
result = items.extend([3, 4])
print(len(items), result)
  1. 3 None
  2. 4 [1, 2, 3, 4]
  3. 2 [3, 4]
  4. 4 None
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Was gibt dieser Code aus?

records = [("A", 4), ("B", 9)]
amounts = []
for _, amount in records:
    amounts.append(amount)
first, *rest = amounts[::-1]
print(first, rest)
  1. 4 [9]
  2. 9 (4,)
  3. 9 [4]
  4. [9] 4
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Was gibt dieser Code aus?

values = [5, -2, 8, -4]
for i, value in enumerate(values):
    if value < 0:
        values[i] = -value
print(values[1::2])
  1. [2, 4]
  2. [-2, -4]
  3. [5, 8]
  4. [5, 2, 8, 4]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Was gibt dieser Code aus?

a = [[9, 2], [8, 1]]
b = a[:]
b.reverse()
b[0][0] = 6
print(a)
  1. [[6, 1], [9, 2]]
  2. [[9, 2], [8, 1]]
  3. [[9, 2], [6, 1]]
  4. [[6, 2], [8, 1]]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Was gibt dieser Code aus?

records = [("Rae", 7), ("Dev", 9), ("Cam", 7)]
def rank(record):
    return (-record[1], record[0])
ordered = sorted(records, key=rank)
name, score = ordered[1]
print(name, score)
  1. Rae 7
  2. Cam 7
  3. Dev 9
  4. Cam -7
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Was gibt dieser Code aus?

def select(values):
    kept = []
    for value in values:
        if value >= 5:
            kept.append(value * 2)
    return kept

a = [3, 5, 8]
b = select(a)
b.pop(0)
print(a, b)
  1. [3, 5, 8] [10, 16]
  2. [5, 8] [16]
  3. [3, 5, 8] [10]
  4. [3, 5, 8] [16]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Eine nicht leere Liste ungerader Länge ist [31, 12, 27, 18, 24, 15, 21]. Welcher Wert steht nach dem Sortieren einer Kopie in der Mitte?
  1. 18
  2. 21
  3. 24
  4. 27
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Was gibt dieser Code aus?

point = (6, 8)
old = point
point = (10,) + point[1:]
print(old, point)
  1. (6, 8) (10, 8)
  2. (10, 8) (10, 8)
  3. (6, 8) (6, 10)
  4. (6, 8) (10,)
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe

Schlüsselbegriffe

73 Schlüsselbegriffe, jeweils mit Definition

A

absteigende Reihenfolge
Eine absteigende Reihenfolge setzt größere Vergleichswerte vor kleinere und wird mit der benannten Sortieroption reverse=True angefordert.
Das absteigende Sortieren von [5, 1, 8] ergibt [8, 5, 1]; das bloße Umkehren der Positionen ergibt [8, 1, 5].
Akkumulator
Ein Akkumulator ist eine Variable, die ein laufendes Ergebnis über Schleifendurchläufe hinweg behält, etwa eine Summe, die durch Addition jedes Elements aktualisiert wird.
Setze total = 0 vor der Verarbeitung der Messwerte und verwende dann total += reading, um frühere Additionen zu erhalten.
Alias
Ein Alias ist ein weiterer Name oder eine weitere Referenz für dasselbe Objekt. Dadurch kann eine Änderung über einen Weg auch über einen anderen sichtbar sein.
Bei current = queue verändert das Anhängen über current auch die Liste, die über queue erreicht wird.
append()
Die Listenmethode append() fügt ihr Argument als ein Element am Ende der bestehenden Liste hinzu und gibt None zurück.
Das Anhängen von [3, 4] an [1, 2] ergibt [1, 2, [3, 4]], weil das Argument ein Element bleibt.
arithmetisches Mittel
Das arithmetische Mittel einer nicht leeren Zahlensammlung ist ihre Summe geteilt durch die Anzahl ihrer Elemente; eine leere Sammlung hat hier kein arithmetisches Mittel.
Für die Messwerte [6, 10, 14] berechnet sum(readings) / len(readings) das arithmetische Mittel 10.0.
ausgeschlossene Endgrenze
Eine ausgeschlossene Endgrenze ist der ausgeschlossene Endpunkt eines Ausschnitts; die ausgewählten Positionen enden in Richtung der Schrittweite vor dieser Grenze.
In values[2:5] bezeichnet Index 5 die Stelle, an der die Auswahl endet, und liefert kein Element.
Ausschnitt
Ein Ausschnitt wählt mithilfe von Grenzen und einer optionalen Schrittweite eine Folge von Elementen aus und gibt eine neue Sequenz des ursprünglichen Datentyps zurück.
tasks[1:4] erstellt eine Liste aus den Positionen 1, 2 und 3, ohne das Element an Position 4 einzuschließen.
Ausschnittszuweisung
Eine Ausschnittszuweisung ersetzt einen ausgewählten Bereich einer veränderlichen Sequenz; ein zusammenhängender Bereich kann eine andere Anzahl von Elementen erhalten.
values[1:2] = [8, 9] ersetzt eine Position durch zwei Werte und erhöht die Länge der Liste um eins.

Ä

äußere Liste
Eine äußere Liste ist der Container, der innere Objekte enthält; das Ändern einer ihrer Positionen unterscheidet sich vom Verändern des Objekts an dieser Position.
b[0] = [9] ersetzt eine Zeilenreferenz, während b[0].append(9) das bestehende Zeilenobjekt verändert.

B

bisheriges Maximum
Das bisherige Maximum ist das größte bislang durchlaufene Element. Es wird mit einem tatsächlichen Element initialisiert und ersetzt, sobald ein größeres Element erreicht wird.
Ein Start mit dem ersten Messwert ermöglicht es dem Muster, den größten Wert korrekt zu finden, wenn alle Messwerte negativ sind.

C

count()
Die Listenmethode count() gibt die Anzahl der Elemente zurück, die ihrem Argument gleich sind, und gibt 0 zurück, wenn der Wert fehlt.
[2, 2.0, 5].count(2) ist 2, weil sowohl die ganze Zahl 2 als auch die Gleitkommazahl 2,0 beim Vergleich gleich 2 sind.

D

Datensatz
Ein Datensatz ist eine Gruppe zusammengehöriger Felder, die eine Entität beschreiben. Er wird häufig als Tupel gespeichert, dessen Positionen unterschiedliche Bedeutungen haben.
("Kai", 86) kann einen Namen und eine Punktzahl darstellen; eine Liste solcher Datensätze kann wachsen, wenn Ergebnisse eingehen.
direkte Veränderung eines Objekts
Eine direkte Veränderung eines Objekts ändert ein bestehendes Objekt, sodass über andere Referenzen auf dieses Objekt derselbe veränderte Zustand sichtbar ist.
values.clear() leert die bestehende Liste, sodass jeder Alias sieht, dass diese Liste leer wird.

E

Element
Ein Element ist ein Wert an einer Position in einer Sammlung; eine verschachtelte Liste zählt als ein Element ihrer äußeren Liste.
In ["desk", ["pen", "pad"]] hat die äußere Liste zwei Elemente, obwohl die innere Liste zwei Zeichenketten enthält.
Elementzuweisung
Eine Elementzuweisung ersetzt das Objekt an einer bestehenden Position einer veränderlichen Sequenz und lässt die Länge der äußeren Sequenz unverändert.
prices[1] = 6.5 korrigiert einen erfassten Preis; die Zuweisung kann kein Element an Index len(prices) erstellen.
Entpacken
Das Entpacken weist Elemente eines iterierbaren Objekts der Reihe nach mehreren Zielen zu. Ihre Anzahl muss übereinstimmen, sofern nicht ein Stern übrige Werte sammelt.
name, score = ("Kai", 86) gibt jedem Feld des Datensatzes einen eigenen, aussagekräftigen Variablennamen.
enumerate()
Die eingebaute Funktion enumerate() liefert Paare aus einer fortlaufenden Nummer und einem Element; standardmäßig beginnt die Nummer bei 0.
for i, value in enumerate(values): gibt dem Code sowohl einen Index als auch das entsprechende aktuelle Element.
extend()
Die Listenmethode extend() fügt jedes Element eines iterierbaren Objekts am Ende der bestehenden Liste hinzu und gibt None zurück.
Das Erweitern von [1, 2] mit [3, 4] ergibt vier äußere Elemente; das Erweitern mit "ab" fügt zwei Zeichen hinzu.

F

Filtern
Das Filtern erstellt eine Sammlung von Elementen, die eine Bedingung erfüllen, und lässt Elemente weg, die sie nicht erfüllen.
Eine Schleife kann nur Punktzahlen von mindestens 60 an eine neue Liste anhängen und dabei die ursprüngliche Reihenfolge der Punktzahlen erhalten.
flache Kopie
Eine flache Kopie erstellt einen neuen äußeren Container und behält Referenzen auf die ursprünglichen Elemente, einschließlich veränderlicher innerer Listen.
Nach b = a.copy() verändert das Anhängen an b dessen äußere Liste, aber eine Änderung an einer gemeinsam referenzierten Zeile kann auch a beeinflussen.

G

gemeinsam referenzierte Zeile
Eine gemeinsam referenzierte Zeile ist eine innere Liste, auf die mehrere Tabellenpositionen verweisen, sodass eine Zelländerung in mehr als einer angezeigten Zeile erscheinen kann.
table = [row, row] speichert eine Zeile zweimal, obwohl die Ausgabe der Tabelle zwei Zeilenpositionen zeigt.
gleichzeitiger Tausch
Ein gleichzeitiger Tausch wertet beide alten Werte aus, bevor sie in einer Entpackungsanweisung den jeweils anderen Namen zugewiesen werden.
left, right = right, left erhält beide Werte, ohne einen separat benannten temporären Wert zu benötigen.

H

hashbarer Wert
Ein hashbarer Wert unterstützt die beständigen Nachschlageregeln, die für Wörterbuchschlüssel benötigt werden; Tupel brauchen hashbare Inhalte, Listen sind nicht hashbar.
(5, 9) kann ein Koordinatenschlüssel sein, ([5], 9) dagegen nicht, weil seine innere Liste nicht hashbar ist.

I

Identität
Identität ist die Eigenschaft, dass es sich um dasselbe Objekt handelt; sie wird mit is geprüft. Gleiche Inhalte können zu unterschiedlichen Listenobjekten gehören.
Zwei separate Literale [1, 3] sind beim Vergleich gleich, aber eine Identitätsprüfung zwischen diesen Listen ist falsch.
Index
Ein Index ist eine ganzzahlige Position zur Auswahl eines Elements; Python zählt am Anfang ab 0 oder am Ende ab −1.
Bei colors = ["blue", "gold"] wählt Index 1 den Wert 'gold' aus, der auch das Element an Index −1 ist.
index()
Die Listenmethode index() findet das erste gleiche Element in ihrem Suchbereich und gibt dessen Index in der ganzen Liste zurück.
labels.index("go", 2) beginnt die Suche bei Position 2, zählt das Ergebnis aber weiterhin ab Position 0.
insert()
Die Listenmethode insert() fügt ein Element vor einer angegebenen Position ein, verschiebt spätere Elemente und erhöht die Länge der Liste.
queue.insert(0, "urgent") setzt ein neues Element an den Anfang, ohne das bisher erste Element zu überschreiben.
Iteration
Iteration ist die wiederholte Verarbeitung nacheinander gelieferter Elemente, etwa wenn eine for-Schleife eine Liste vom ersten bis zum letzten Element durchläuft.
Eine Schleife über names weist der Schleifenvariable jeweils den aktuellen Namen zu, bevor sie ihren Schleifenkörper ausführt.
iterierbares Objekt
Ein iterierbares Objekt kann einer Schleife oder einer Funktion wie list() nacheinander Elemente liefern.
Ein Zahlenbereich liefert Zahlen, sodass list(range(3)) sie in der neuen Liste [0, 1, 2] sammelt.

J

join()
Die Zeichenkettenmethode join() fügt übergebene Zeichenketten zu einer Zeichenkette zusammen und setzt die Zeichenkette, auf der sie aufgerufen wird, zwischen die Elemente.
" / ".join(["red", "blue"]) ergibt 'red / blue'; numerische Elemente müssen zuerst in Zeichenketten umgewandelt werden.

L

lexikografische Reihenfolge
Die lexikografische Reihenfolge vergleicht Sequenzen von links nach rechts. Das erste ungleiche Paar entscheidet; bildet eine kürzere Sequenz den Anfang der anderen, kommt sie zuerst.
[3, 20] < [4, 1] ist wahr, weil die ersten Elemente die Reihenfolge entscheiden, bevor die zweiten verglichen werden.
Liste
Eine Liste ist eine geordnete, veränderliche Sammlung, deren Elemente über ihre Position gelesen werden können. Sie kann wiederholte Werte und Elemente unterschiedlicher Datentypen enthalten.
Ein Programm kann mehrere Quizergebnisse in scores = [73, 91, 73] speichern und gemeinsam verarbeiten.
Listenparameter
Ein Listenparameter ist ein lokaler Funktionsname, der zunächst das Listenobjekt des aufrufenden Codes referenziert, sodass die Funktion dieses Objekt verändern kann.
Eine Funktion, die values.clear() aufruft, leert die Liste des aufrufenden Codes; die Zuweisung values = [] tut das nicht.

M

Median
Der Median ist der Wert in der Mitte sortierter Daten; bei einer nicht leeren Liste ungerader Länge ist er das Element an Index len(ordered) // 2.
Das Sortieren von [5, 12, 2] ergibt [2, 5, 12] und setzt den Median 5 an den mittleren Index 1.
Methode
Eine Methode ist eine Funktion, die einem Objekt zugeordnet ist und über Punktnotation aufgerufen wird, um eine Operation auf diesem Objekt auszuführen.
queue.append("next") ruft die Methode der Liste auf und übergibt das hinzuzufügende Element als Argument.

N

nachrangiges Vergleichskriterium
Ein nachrangiges Vergleichskriterium ist eine zweite Vergleichsregel, die bei gleichen Schlüsseln einer früheren Regel verwendet wird, etwa der Vergleich von Namen nach gleichen Punktzahlen.
Zwei Datensätze mit der Punktzahl 80 können nach Namen geordnet werden, wenn der Schlüssel diesen Namen nach der Punktzahl enthält.
Name mit Stern
Ein Name mit Stern sammelt beim Entpacken alle Werte, die nicht den Zielen ohne Stern zugewiesen werden, und erhält immer eine Liste.
In first, *rest = (4, 8, 12) ist rest gleich [8, 12], obwohl die Eingabe ein Tupel ist.
Neubindung
Eine Neubindung ändert das Objekt, auf das ein Name verweist, ohne andere Namen umzulenken, die das vorherige Objekt referenziert haben.
Nach b = a gibt die Zuweisung b = [] dem Namen b eine neue Liste, während a weiterhin das Original referenziert.

P

Packen
Das Packen sammelt mehrere Ausdruckswerte in einem Tupel, üblicherweise mithilfe von Kommas und ohne dass umschließende Klammern nötig sind.
result = lowest, highest speichert beide Werte in einem Tupel, das aus einer Funktion zurückgegeben werden kann.
pop()
Die Listenmethode pop() entfernt ein Element anhand seines Index und gibt es zurück; ohne angegebenen Index verwendet sie die letzte Position.
current = queue.pop(0) speichert das erste Element der Warteschlange und entfernt diese Position aus der bestehenden Liste.

R

Referenz
Eine Referenz verbindet einen Namen oder eine Containerposition mit einem Objekt; das Kopieren dieser Referenz kopiert nicht das Objekt selbst.
b = a gibt beiden Variablennamen einen Weg zur selben Liste, sodass Änderungen gemeinsam sichtbar sein können.
remove()
Die Listenmethode remove() löscht das erste Element, das gleich ihrem Argument ist, und löst ValueError aus, wenn es keinen Treffer gibt.
labels.remove("old") löscht einen passenden Wert; die Methode interpretiert "old" nicht als Position.
reversed()
Die eingebaute Funktion reversed() liefert Sequenzelemente vom letzten bis zum ersten, ohne die gespeicherten Positionen der Sequenz umzuordnen.
for task in reversed(tasks): verarbeitet die letzte Aufgabe zuerst und erhält dabei die ursprüngliche Listenreihenfolge.
Rückgabewert
Ein Rückgabewert ist das Objekt, das ein Funktionsaufruf für den aufrufenden Code erzeugt, unabhängig von Änderungen, die während des Aufrufs an Argumenten vorgenommen werden.
Eine Funktion kann etwas an eine Liste anhängen und dennoch None zurückgeben, wenn ihr Funktionskörper keine ausdrückliche return-Anweisung hat.

S

Schleifenvariable
Eine Schleifenvariable ist ein Name, der bei jedem Durchlauf an das aktuelle Element gebunden wird; ihre Neubindung weist der ursprünglichen Liste keinen Wert zu.
In for value in values: value = 0 ändert sich der Schleifenname, aber nicht die gespeicherten Listenpositionen.
Schlüssel ohne Beachtung der Groß- und Kleinschreibung
Ein Schlüssel ohne Beachtung der Groß- und Kleinschreibung vergleicht vereinheitlichte Textwerte und erhält dabei die Schreibweise jeder ursprünglichen Zeichenkette in der zurückgegebenen Sammlung.
key=str.lower lässt "Oak" und "oak" gleich vergleichen, ohne ihre Großschreibung zu ändern.
Schlüsselfunktion
Eine Schlüsselfunktion berechnet aus jedem Eingabeelement einen Vergleichswert und lässt dabei die ursprünglichen Elemente in der sortierten Ausgabe unverändert.
key=len ordnet Wörter nach Länge, ohne sie durch ihre Längen zu ersetzen.
Schrittweite eines Ausschnitts
Die Schrittweite eines Ausschnitts ist eine ganze Zahl ungleich null, die den Abstand und die Richtung zwischen ausgewählten Positionen einer Sequenz steuert.
values[1::2] wählt ab 1 jede zweite Position aus; eine negative Schrittweite läuft rückwärts.
sort()
Die Listenmethode sort() ordnet die bestehende Liste nach Vergleichsreihenfolge um und gibt None zurück; optional akzeptiert sie die Argumente key und reverse.
scores.sort() verändert die aufgezeichnete Reihenfolge direkt, und Aliase von scores sehen die sortierten Positionen.
sorted()
Die eingebaute Funktion sorted() akzeptiert ein iterierbares Objekt und gibt eine neue Liste seiner Elemente in Vergleichsreihenfolge zurück, ohne die Eingabereihenfolge zu verändern.
ordered = sorted(scores) erhält die ursprüngliche Eingangsreihenfolge über die Variable scores.
split()
Die Zeichenkettenmethode split() teilt Text anhand eines angegebenen Trennzeichens oder anhand von Regeln für Leerraumzeichen in eine Liste von Zeichenkettenteilen.
"yes|no|maybe".split("|") erstellt aus der durch Trennzeichen gegliederten Eingabe drei separate Textelemente.
stabiles Sortieren
Stabiles Sortieren erhält die Eingabereihenfolge von Elementen mit gleichen Vergleichsschlüsseln zueinander, auch beim absteigenden Sortieren.
Wörter gleicher Länge behalten ihre ursprüngliche Reihenfolge zueinander, wenn len die einzige Schlüsselfunktion ist.
Standardwert None
Ein Standardwert None kann ein weggelassenes Listenargument kennzeichnen, sodass eine Funktion für jeden Aufruf mit Standardwert innerhalb ihres Funktionskörpers eine neue Liste erstellt.
Bei values=None vermeidet der Zweig if values is None: values = [] eine versehentlich gemeinsam referenzierte Standardliste.
Suche nach dem ersten Treffer
Eine Suche nach dem ersten Treffer durchläuft Elemente, bis eines eine Prüfung besteht, speichert das Ergebnis und stoppt, bevor spätere Treffer es ersetzen können.
Eine Schleife kann den Index des ersten negativen Messwerts speichern und die Suche mit break sofort beenden.

T

tiefe Kopie
Eine tiefe Kopie vervielfältigt eine verschachtelte Struktur rekursiv, sodass Änderungen an kopierten inneren Listen die ursprünglichen inneren Listen nicht erreichen.
copy.deepcopy(rows) kann ursprüngliche Tabellenzellen erhalten, während eine separate verschachtelte Struktur bearbeitet wird.
Transformation
Eine Transformation berechnet aus einem Eingabeelement einen Ausgabewert und erstellt dabei oft eine neue Liste mit einem Ergebnis pro ursprünglichem Element.
Das Anhängen von int(text) für jede numerische Zeichenkette erstellt eine Liste, die mit sum() summiert werden kann.
Tupel
Ein Tupel ist eine geordnete Sequenz, deren Elementpositionen nach der Erstellung des Tupels nicht ersetzt, hinzugefügt oder entfernt werden können.
location = (5, 9) speichert ein festes Koordinatenpaar, das weiterhin Indizierung und Ausschnitte unterstützt.
Tupel mit einem Element
Ein Tupel mit einem Element hat eine einzige Position und wird mit einem abschließenden Komma geschrieben, um es von einem gruppierten Ausdruck zu unterscheiden.
(11,) ist ein Tupel, während (11) die ganze Zahl 11 ergibt, ohne eine Sammlung zu erstellen.
Tupelschlüssel
Ein Tupelschlüssel kombiniert Vergleichsfelder in ihrer Vorrangfolge; spätere Felder entscheiden nur, wenn alle vorherigen Felder gleich sind.
Die Rückgabe von (-score, name) ordnet Punktzahlen absteigend und löst Gleichstände anhand der Namen von A bis Z auf.

U

Umkehrung der Reihenfolge
Die Umkehrung der Reihenfolge dreht die bestehende Reihenfolge einer Sequenz um, ohne Positionen anhand ihres Werts auszuwählen. Daher muss das Ergebnis weder aufsteigend noch absteigend sein.
values.reverse() verändert eine Liste, während values[::-1] eine umgekehrte flache Kopie erstellt.
Unveränderlichkeit
Unveränderlichkeit bedeutet, dass der eigene Zustand eines Objekts nicht direkt geändert werden kann; ein Tupel legt seine Elementreferenzen fest, nicht die veränderlichen Objekte darin.
Bei einem Tupel, das eine Liste enthält, kann die Listenposition nicht ersetzt werden, aber an die gespeicherte Liste kann weiterhin etwas angehängt werden.

V

veränderliches Standardargument
Ein veränderliches Standardargument ist ein veränderbares Objekt, das bei der Definition einer Funktion erstellt und von Aufrufen wiederverwendet wird, die dieses Argument weglassen.
Ein Standardwert basket=[] behält angehängte Elemente zwischen Aufrufen mit Standardwert, weil jeder Aufruf dieselbe Liste erreicht.
Veränderung eines Objekts
Die Veränderung eines Objekts ändert den Inhalt oder Zustand eines bestehenden Objekts, sodass über jede Referenz auf dieses Objekt dieselbe Änderung sichtbar ist.
items[0] = 7 verändert die Liste; über jeden Alias dieser Liste ist sichtbar, dass ihre erste Position zu 7 wird.
Verkettung
Die Verkettung fügt Sequenzen aneinander; die Listenverkettung mit + erstellt aus zwei Listen eine neue äußere Liste.
morning + afternoon kann zwei Listen von Messwerten kombinieren und dabei beide ursprünglichen Listen unverändert lassen.
verschachtelte Liste
Eine verschachtelte Liste ist eine Liste, die andere Listen enthält; jede innere Liste ist ein Element, auf das separat zugegriffen werden kann und das separat verarbeitet werden kann.
In [[2, 5], [7]] enthält die äußere Liste zwei Zeilen mit den Längen zwei und eins.
verschachtelte Schleife
Eine verschachtelte Schleife ist eine Schleife innerhalb einer anderen Schleife; die innere Schleife erledigt ihre Arbeit bei jedem Durchlauf der äußeren vollständig.
Eine Zeilenschleife mit einer Zellenschleife kann Tabellen mit unterschiedlich vielen Elementen in den einzelnen Zeilen verarbeiten.

W

weggelassene Grenze
Eine weggelassene Grenze lässt einen Ausschnitt das passende Ende einer Sequenz verwenden, je nachdem, ob seine Schrittweite vorwärts oder rückwärts führt.
In values[::-1] sorgen weggelassene Grenzen dafür, dass der rückwärts gerichtete Ausschnitt die ganze Liste in umgekehrter Reihenfolge enthält.
Wiederholung
Bei der Wiederholung wiederholt * mit einer ganzen Zahl die Elementreferenzen einer Sequenz in ihrer Reihenfolge; bei einer Anzahl von null oder weniger entsteht eine leere Sequenz.
[0] * 5 erstellt fünf Zählerpositionen, während das Wiederholen einer Zeilenliste gemeinsam referenzierte innere Zeilen erzeugen kann.

Z

Zähler
Ein Zähler ist eine Variable, die festhält, wie oft eine Bedingung erfüllt wird. Er beginnt häufig bei 0 und wird pro Treffer um 1 erhöht.
Ein Punktzahlzähler addiert 1 für jede Punktzahl zum Bestehen, unabhängig davon, ob diese 60 oder 100 beträgt.
Zeile
Eine Zeile in einer listenbasierten Tabelle ist eine innere Liste, die mit dem ersten Index ausgewählt wird, bevor ein zweiter Index eine Zelle darin auswählt.
grid[1] ruft die gesamte zweite Zeile ab, sodass len(grid[1]) die Zellen dieser Zeile zählt.
Zelle
Eine Zelle ist ein einzelner Wert in einer Tabelle, den du erreichst, indem du zuerst seine Zeile und dann seine Position innerhalb dieser Zeile auswählst.
grid[0][2] = 9 ersetzt die dritte Zelle der ersten Zeile, sofern diese Position bereits existiert.
zip()
Die eingebaute Funktion zip() paart entsprechende Elemente aus iterierbaren Eingabeobjekten und stoppt standardmäßig, wenn die kürzeste Eingabe endet.
Das Paaren von drei Namen mit zwei Punktzahlen erzeugt zwei Paare; für den Namen ohne Gegenstück ist eine separate Entscheidung nötig.
Zugehörigkeitsprüfung
Eine Zugehörigkeitsprüfung prüft, ob ein gleicher Wert in einer Sammlung vorkommt, und gibt über in oder not in ein boolesches Ergebnis zurück.
"ready" in statuses kann prüfen, ob eine Liste genau diese Statuszeichenkette unter Beachtung der Groß- und Kleinschreibung enthält.

Ü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