Listen und Tupel in Python
sort(), sorted() und Schlüsselfunktionen.AnfängerEinheit 6 von 10 in Kurs: Python-Programmierung – Schleifen, Funktionen, Listen und Dateien
Was du lernst
- 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 lesenListenliterale 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ählenMit 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 zusammenfassenListen mit + und * verbinden und wiederholen, Listen vergleichen, Summen, Extremwerte und arithmetische Mittel mit sum(), min() und max() berechnen und zwischen Zeichenketten und Listen umwandeln.
- Eine Liste erstellen und ihre Elemente über den Index lesen
- 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 entfernenEine 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 ersetzenWerte mit index(), count() und in finden und einzelne Elemente oder ganze Bereiche durch Zuweisung an einen Index oder Ausschnitt ersetzen.
- Elemente hinzufügen und entfernen
- 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 durchlaufenZwischen 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 anwendenElemente 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 arbeitenEine Tabelle als Liste von Zeilen speichern, Zellen mit zwei Indizes lesen und ändern und jede Zelle mit verschachtelten Schleifen durchlaufen.
- Elemente und Positionen durchlaufen
- 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ählenTupel 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 entpackenMehreren 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.
- Tupel erstellen und zwischen Tupeln und Listen wählen
- 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 unterscheidenErklä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 vermeidenMit 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ückgebenVorhersagen, 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.
- Namen, Objekte und Aliase unterscheiden
- 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() sortierenZwischen 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 sortierenNach 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.
- Mit sort() und sorted() sortieren
Listen und Tupel in Python einfach erklärt
1Listen 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.
| Ausdruck | Ergebnis | Position |
|---|---|---|
scores[0] | 88 | Erste |
scores[1] | 92 | Zweite |
scores[2] | 75 | Dritte |
scores[-1] | 75 | Letzte |
scores[-2] | 92 | Vorletzte |
scores[-3] | 88 | Drittletzte |
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 istlen(values) - 1.- Negative Indizes zählen vom Ende aus, beginnend bei
-1. - Ein ungültiger Elementindex löst
IndexErroraus; eine Gleitkommazahl als Index löstTypeErroraus. inprü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
| Ausschnitt | Bedeutung | Ergebnis |
|---|---|---|
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
| Ausdruck | Ergebnis |
|---|---|
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,minundmaxerzeugen 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.
spliterzeugt Textteile;joinauf einem Trennzeichen fügt Zeichenketten zusammen.
2Eine 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
| Operation | Verwendet | Gibt zurück |
|---|---|---|
items.pop() | Letzte Position | Entferntes Element |
items.pop(i) | Position i | Entferntes Element |
items.remove(x) | Erster Wert gleich x | None |
del items[i] | Position i | Keinen Rückgabewert |
del items[start:stop] | Ausschnitt von Positionen | Keinen Rückgabewert |
items.clear() | Ganze Liste | None |
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
appendfügt ein Element hinzu;extendfügt jedes übergebene Element hinzu.insertfügt vor einer Position ein und verschiebt spätere Elemente.popentfernt ein Element anhand seiner Position und gibt es zurück.removelöscht den ersten gleichen Wert und schlägt fehl, wenn er fehlt.dellöscht Elemente an Positionen oder Ausschnitte;clearleert dieselbe Liste.- Methoden wie
appendgebenNonezurü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().
| Anweisung | Wirkung 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
indexgibt die erste passende Position zurück und löst bei einem fehlenden WertValueErroraus.countgibt 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.
3Listen 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 undenumeratefür beides. - Die Neubindung der Schleifenvariable ersetzt kein Listenelement.
zipstoppt bei der kürzeren Eingabe.reverseddurchläuft rückwärts, ohne die Liste zu verändern.- Eine
while-Schleife muss ihren Index weiterzählen und vorlen(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.
4Tupel 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:
| Ausdruck | Wert 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.
5Gemeinsame 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
| Anweisung | Was ändert sich? | Was sieht ein Alias? |
|---|---|---|
b.append(4) | Bestehende Liste | Hinzugefügtes Element |
b[0] = 9 | Bestehende Liste | Ersetztes Element |
b = [7, 8] | Der Name b | Ursprü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ährendisdie 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()undcopy()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.deepcopykopiert 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
Noneund erstelle innerhalb der Funktion eine Liste, um einen neuen Standardwert zu erhalten.
6Sequenzen 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] | Ergebnis | Verä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
sortverändert eine Liste und gibtNonezurück;sortedgibt eine neue Liste zurück.sortedakzeptiert iterierbare Objekte wie Tupel und Zeichenketten.reverse=Truesortiert 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=lenoderkey=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.
minundmaxgeben ursprüngliche Elemente zurück und wählen bei gleichen Schlüsseln das erste.
Listen und Tupel in Python: Beispiele
1Lieferzahlen einer Woche lesen
13 Schritte
- 1Einfü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. - 2BeispielAnzahlen 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 mitdeliveries[-1]lesen, also mit einem negativen Index vom Ende aus. - 3TippEinen 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, dannFalse. Der Wert 9 kommt vor, 4 dagegen nicht, obwohl 4 ein gültiger Index ist.inprüft die gespeicherten Werte. Wenn du die Anzahl an Position 4 möchtest, verwendedeliveries[4]. Das gibt17zurück. - 4HerausforderungDie vorletzte Anzahl finden
Was gibt
deliveries[-2]zurück, und würdedeliveries[len(deliveries)]funktionieren?---reveal---
Der negative Index
-2wählt9aus, eine Position vor dem letzten Element17. Der zweite Ausdruck versucht auf Index 5 zuzugreifen und löst IndexError aus. Verwendelen(deliveries) - 1oder-1, um das letzte Element auszuwählen; die Anzahl der Elemente ist um eins größer als der letzte nicht negative Index. - 5BeispielDie 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.middleist eine neue Liste, sodass Änderungen an ihren äußeren Positionen keine Position indeliveriesersetzen. - 6Erklä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. - 7BeispielJeden 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. - 8HerausforderungEine Anzahl von einer Liste unterscheiden
Welche Werte und Datentypen haben
deliveries[2]unddeliveries[2:3]?---reveal---
deliveries[2]ist die ganze Zahl15.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. - 9BeispielEin 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, dann10.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. - 10KernaussageEine 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 selectedaus. Leere Listen werden als falsch ausgewertet. Obwohlsum([])gleich 0 ist, würde die Division dieser Summe durchlen([])durch null dividieren. Auchminundmaxschlagen bei diesen leeren Eingaben fehl. - 11VerbindungEine 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.joinwird 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.splitfunktioniert umgekehrt und teilt Text in Zeichenkettenteile. - 12HerausforderungAuswä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 15aus. 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 andeliveries[2]gleich 15. - 13ZusammenfassungDas 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.
2Eine Materialanforderung bearbeiten
10 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungDie Liste und den Rückgabewert verfolgen
- 2BeispielMehrere Artikel hinzufügen
- 3BeispielEinen Artikel vorne einfügen
- 4BeispielEinen abgeholten Artikel entfernen und speichern
- 5HerausforderungNach einem Wert entfernen
- 6BeispielDie Position für eine Korrektur finden
- 7BeispielEinen Artikel durch mehrere ersetzen
- 8HerausforderungEinen Bereich löschen und einen Wert finden
- 9HerausforderungDie Anforderung abschließen, ohne sie zu verlieren
- 10ZusammenfassungDie passende Operation für die Änderung wählen
3Messwerte bereinigen und eine Tabelle summieren
13 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungEntscheiden, was jede Schleife mitführt
- 2ErklärungEinen Wert lesen, ohne seine Position zu bearbeiten
- 3BeispielUngültige Messwerte über den Index ersetzen
- 4VerbindungBezeichnungen mit Messwerten paaren
- 5HerausforderungEin übersprungenes Element erklären
- 6BeispielDie positiven Messwerte zählen
- 7BeispielEin gefiltertes und transformiertes Ergebnis erstellen
- 8TippBis zum ersten Treffer suchen
- 9HerausforderungEin gültiges Maximum wählen
- 10BeispielEine Zeile und eine Zelle auswählen
- 11BeispielAlle Zeilen summieren
- 12HerausforderungÜber die ganze Tabelle hinweg filtern
- 13ZusammenfassungDie Vorbereitung von der wiederholten Arbeit trennen
4Einen festen Datensatz verwenden und seine Felder entpacken
10 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungEinen Datensatz zusammenhalten
- 2BeispielDen Stationsdatensatz erstellen
- 3KernaussageDie Grenze der Unveränderlichkeit prüfen
- 4HerausforderungEin Tupel mit einem Element erstellen
- 5BeispielJedem Feld einen Namen geben
- 6BeispielDen ersten Messwert und den Rest behalten
- 7HerausforderungKoordinatenwerte tauschen
- 8BeispielEin Paar von Extremwerten zurückgeben
- 9HerausforderungEin ausgewähltes Feld lesen und entpacken
- 10ZusammenfassungVor dem Entpacken die Struktur lesen
5Eine kopierte Tabelle durch eine Funktion verfolgen
14 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungPfade zu Objekten zeichnen
- 2BeispielEinen Alias erstellen
- 3BeispielEinen Namen umleiten
- 4HerausforderungZwei Arten der Addition vorhersagen
- 5BeispielDie äußere Tabelle kopieren
- 6BeispielEine gemeinsam referenzierte Zeile verändern
- 7KernaussageEine kopierte Zeile ersetzen
- 8HerausforderungEine tiefere Kopie wählen
- 9BeispielÜber einen Parameter verändern
- 10VerbindungEine separate Liste zurückgeben
- 11ErklärungEine dauerhaft gemeinsame Standardliste vermeiden
- 12HerausforderungLokale Neubindung vom Leeren unterscheiden
- 13HerausforderungEine an eine Funktion übergebene flache Kopie verfolgen
- 14ZusammenfassungDie veränderte Ebene verfolgen
6Datensätze ordnen und ihre Eingangsreihenfolge erhalten
13 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungGespeicherte Daten von Vergleichsschlüsseln trennen
- 2BeispielDie Eingangsreihenfolge erhalten
- 3BeispielUmkehren mit absteigendem Sortieren vergleichen
- 4TippDen Datentyp der Eingabe prüfen
- 5HerausforderungEin Sortierergebnis verfolgen
- 6BeispielEinen Schlüssel für die Punktzahl wählen
- 7KernaussageDatensätze mit gleichem Schlüssel in Eingangsreihenfolge halten
- 8HerausforderungEin aufrufbares Objekt übergeben
- 9BeispielEin alphabetisches Vergleichskriterium für Gleichstände ergänzen
- 10TippNur die numerische Richtung umkehren
- 11VerbindungEin Element anhand eines extremen Schlüssels auswählen
- 12HerausforderungDatensätze und Namen in ihrer ursprünglichen Form behalten
- 13ZusammenfassungWirkung und Regel wählen
Listen und Tupel in Python: Übungsaufgaben
Set 1: Sequenzen lesen, Ausschnitte auswählen und Sequenzen verändern10 Übungsfragen
Frage 1 von 10
levels = [14, 29, 37, 52] der Wert von levels[-2]?Antwort zeigenAntwort ausblenden
-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
codes = [2, 5, 8, 11, 14, 17] der Wert von codes[1:5:2]?Antwort zeigenAntwort ausblenden
[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"])
Antwort zeigenAntwort ausblenden
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])
Antwort zeigenAntwort ausblenden
'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]
Antwort zeigenAntwort ausblenden
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
Antwort zeigenAntwort ausblenden
(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)
Antwort zeigenAntwort ausblenden
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])
Antwort zeigenAntwort ausblenden
[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
items = [9, 16, 25], wenn Python items[len(items)] auswertet?Antwort zeigenAntwort ausblenden
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
[4, 99] < [5, 1]?Antwort zeigenAntwort ausblenden
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)
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)
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
table = [[6, 8, 10], [11, 13, 15]] der Ausdruck table[1][0] + table[0][2]?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
list(zip(["Lee", "Mo", "Nia"], [41, 56]))?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])
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
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)
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
[-14, -6, -19] finden. Womit sollte ihr bisheriges Maximum initialisiert werden?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)
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
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
amount nach label, amount = ("rice", 4)?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
middle nach first, *middle, last = (2, 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)
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)
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)
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)
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)
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
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)
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)
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
tags = ["new", "old", "new"] der Ausdruck tags.count("done") zurück?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)
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])
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)
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)
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)
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]
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
codes = ["q", "r", "q", "s", "q"] der Wert von codes.index("q", 1)?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)
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)
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
result nach nums = [8, 2, 5] und result = nums.sort()?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
sorted(["20", "3", "11"]) zurück?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
sorted(["pear", "a", "plum", "to"], key=len) zurück?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
values = [6, 1, 4] die Ausdrücke values[::-1] und sorted(values, reverse=True) in dieser Reihenfolge?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
(name, score). Welcher Körper einer Schlüsselfunktion ordnet höhere Punktzahlen zuerst und bei gleichen Punktzahlen Namen von A bis Z?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))
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))
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))
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)
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
(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?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
values = [12, 24] der Wert von values[5:20]?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
None?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)
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)
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])
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)
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)
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)
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
[31, 12, 27, 18, 24, 15, 21]. Welcher Wert steht nach dem Sortieren einer Kopie in der Mitte?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)
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe
Schlüsselbegriffe
A
absteigende Reihenfolge
reverse=True angefordert.[5, 1, 8] ergibt [8, 5, 1]; das bloße Umkehren der Positionen ergibt [8, 1, 5].Akkumulator
total = 0 vor der Verarbeitung der Messwerte und verwende dann total += reading, um frühere Additionen zu erhalten.Alias
current = queue verändert das Anhängen über current auch die Liste, die über queue erreicht wird.append()
append() fügt ihr Argument als ein Element am Ende der bestehenden Liste hinzu und gibt None zurück.[3, 4] an [1, 2] ergibt [1, 2, [3, 4]], weil das Argument ein Element bleibt.arithmetisches Mittel
[6, 10, 14] berechnet sum(readings) / len(readings) das arithmetische Mittel 10.0.ausgeschlossene Endgrenze
values[2:5] bezeichnet Index 5 die Stelle, an der die Auswahl endet, und liefert kein Element.Ausschnitt
tasks[1:4] erstellt eine Liste aus den Positionen 1, 2 und 3, ohne das Element an Position 4 einzuschließen.Ausschnittszuweisung
values[1:2] = [8, 9] ersetzt eine Position durch zwei Werte und erhöht die Länge der Liste um eins.Ä
äußere Liste
b[0] = [9] ersetzt eine Zeilenreferenz, während b[0].append(9) das bestehende Zeilenobjekt verändert.B
bisheriges Maximum
C
count()
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
("Kai", 86) kann einen Namen und eine Punktzahl darstellen; eine Liste solcher Datensätze kann wachsen, wenn Ergebnisse eingehen.direkte Veränderung eines Objekts
values.clear() leert die bestehende Liste, sodass jeder Alias sieht, dass diese Liste leer wird.E
Element
["desk", ["pen", "pad"]] hat die äußere Liste zwei Elemente, obwohl die innere Liste zwei Zeichenketten enthält.Elementzuweisung
prices[1] = 6.5 korrigiert einen erfassten Preis; die Zuweisung kann kein Element an Index len(prices) erstellen.Entpacken
name, score = ("Kai", 86) gibt jedem Feld des Datensatzes einen eigenen, aussagekräftigen Variablennamen.enumerate()
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()
extend() fügt jedes Element eines iterierbaren Objekts am Ende der bestehenden Liste hinzu und gibt None zurück.[1, 2] mit [3, 4] ergibt vier äußere Elemente; das Erweitern mit "ab" fügt zwei Zeichen hinzu.F
Filtern
flache Kopie
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
table = [row, row] speichert eine Zeile zweimal, obwohl die Ausgabe der Tabelle zwei Zeilenpositionen zeigt.gleichzeitiger Tausch
left, right = right, left erhält beide Werte, ohne einen separat benannten temporären Wert zu benötigen.H
hashbarer Wert
(5, 9) kann ein Koordinatenschlüssel sein, ([5], 9) dagegen nicht, weil seine innere Liste nicht hashbar ist.I
Identität
is geprüft. Gleiche Inhalte können zu unterschiedlichen Listenobjekten gehören.[1, 3] sind beim Vergleich gleich, aber eine Identitätsprüfung zwischen diesen Listen ist falsch.Index
colors = ["blue", "gold"] wählt Index 1 den Wert 'gold' aus, der auch das Element an Index −1 ist.index()
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()
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
for-Schleife eine Liste vom ersten bis zum letzten Element durchläuft.names weist der Schleifenvariable jeweils den aktuellen Namen zu, bevor sie ihren Schleifenkörper ausführt.iterierbares Objekt
list() nacheinander Elemente liefern.list(range(3)) sie in der neuen Liste [0, 1, 2] sammelt.J
join()
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
[3, 20] < [4, 1] ist wahr, weil die ersten Elemente die Reihenfolge entscheiden, bevor die zweiten verglichen werden.Liste
scores = [73, 91, 73] speichern und gemeinsam verarbeiten.Listenparameter
values.clear() aufruft, leert die Liste des aufrufenden Codes; die Zuweisung values = [] tut das nicht.M
Median
len(ordered) // 2.[5, 12, 2] ergibt [2, 5, 12] und setzt den Median 5 an den mittleren Index 1.Methode
queue.append("next") ruft die Methode der Liste auf und übergibt das hinzuzufügende Element als Argument.N
nachrangiges Vergleichskriterium
Name mit Stern
first, *rest = (4, 8, 12) ist rest gleich [8, 12], obwohl die Eingabe ein Tupel ist.Neubindung
b = a gibt die Zuweisung b = [] dem Namen b eine neue Liste, während a weiterhin das Original referenziert.P
Packen
result = lowest, highest speichert beide Werte in einem Tupel, das aus einer Funktion zurückgegeben werden kann.pop()
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
b = a gibt beiden Variablennamen einen Weg zur selben Liste, sodass Änderungen gemeinsam sichtbar sein können.remove()
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()
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
None zurückgeben, wenn ihr Funktionskörper keine ausdrückliche return-Anweisung hat.S
Schleifenvariable
for value in values: value = 0 ändert sich der Schleifenname, aber nicht die gespeicherten Listenpositionen.Schlüssel ohne Beachtung der Groß- und Kleinschreibung
key=str.lower lässt "Oak" und "oak" gleich vergleichen, ohne ihre Großschreibung zu ändern.Schlüsselfunktion
key=len ordnet Wörter nach Länge, ohne sie durch ihre Längen zu ersetzen.Schrittweite eines Ausschnitts
values[1::2] wählt ab 1 jede zweite Position aus; eine negative Schrittweite läuft rückwärts.sort()
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()
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()
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
len die einzige Schlüsselfunktion ist.Standardwert None
None kann ein weggelassenes Listenargument kennzeichnen, sodass eine Funktion für jeden Aufruf mit Standardwert innerhalb ihres Funktionskörpers eine neue Liste erstellt.values=None vermeidet der Zweig if values is None: values = [] eine versehentlich gemeinsam referenzierte Standardliste.Suche nach dem ersten Treffer
break sofort beenden.T
tiefe Kopie
copy.deepcopy(rows) kann ursprüngliche Tabellenzellen erhalten, während eine separate verschachtelte Struktur bearbeitet wird.Transformation
int(text) für jede numerische Zeichenkette erstellt eine Liste, die mit sum() summiert werden kann.Tupel
location = (5, 9) speichert ein festes Koordinatenpaar, das weiterhin Indizierung und Ausschnitte unterstützt.Tupel mit einem Element
(11,) ist ein Tupel, während (11) die ganze Zahl 11 ergibt, ohne eine Sammlung zu erstellen.Tupelschlüssel
(-score, name) ordnet Punktzahlen absteigend und löst Gleichstände anhand der Namen von A bis Z auf.U
Umkehrung der Reihenfolge
values.reverse() verändert eine Liste, während values[::-1] eine umgekehrte flache Kopie erstellt.Unveränderlichkeit
V
veränderliches Standardargument
basket=[] behält angehängte Elemente zwischen Aufrufen mit Standardwert, weil jeder Aufruf dieselbe Liste erreicht.Veränderung eines Objekts
items[0] = 7 verändert die Liste; über jeden Alias dieser Liste ist sichtbar, dass ihre erste Position zu 7 wird.Verkettung
+ 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
[[2, 5], [7]] enthält die äußere Liste zwei Zeilen mit den Längen zwei und eins.verschachtelte Schleife
W
weggelassene Grenze
values[::-1] sorgen weggelassene Grenzen dafür, dass der rückwärts gerichtete Ausschnitt die ganze Liste in umgekehrter Reihenfolge enthält.Wiederholung
* 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
Zeile
grid[1] ruft die gesamte zweite Zeile ab, sodass len(grid[1]) die Zellen dieser Zeile zählt.Zelle
grid[0][2] = 9 ersetzt die dritte Zelle der ersten Zeile, sofern diese Position bereits existiert.zip()
zip() paart entsprechende Elemente aus iterierbaren Eingabeobjekten und stoppt standardmäßig, wenn die kürzeste Eingabe endet.Zugehörigkeitsprüfung
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
Erstelle deine eigenen Lernmaterialien
Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.