Python-Kurs / Listen ändern, sortieren und richtig kopieren
Eine Liste speichert Elemente in einer Reihenfolge und lässt sich verändern. Unterscheiden Sie dabei Methoden, die das bestehende Objekt ändern, von Funktionen, die eine neue Liste liefern – besonders beim Sortieren und Kopieren.
Elemente passend hinzufügen, ändern und entfernen
Listen erzeugen Sie mit eckigen Klammern; der erste Index ist null. Eine Liste kann denselben Wert mehrfach und auch unterschiedliche Datentypen enthalten. Für eine Summe sollten die Werte dennoch dieselbe Bedeutung und Einheit haben. Ein Textwert zwischen Zahlen wird durch die gemeinsame Liste nicht automatisch zu einer Zahl.
| Absicht | Aufruf | Verhalten |
|---|---|---|
| Ein Element anhängen | items.append(value) |
Eine übergebene Liste wird als ein verschachteltes Element angehängt. |
| Mehrere Elemente anhängen | items.extend(values) |
Übernimmt die Elemente eines iterierbaren Werts einzeln. |
| Eine Position entfernen | items.pop(index) |
Entfernt das betreffende Element und gibt es zurück. |
| Einen Wert entfernen | items.remove(value) |
Entfernt nur den ersten passenden Wert; fehlt er, entsteht ein Fehler. |
Mit items[0] = value ersetzen Sie ein vorhandenes erstes Element. Das fügt nicht automatisch ein Element zu einer leeren Liste hinzu. Für einen neuen Eintrag am Ende verwenden Sie append. Ohne Index entfernt pop() das letzte Element. Die Python-Anleitung zu Listenmethoden beschreibt die einzelnen Operationen.
Das vollständige Änderungs- und Sortierbeispiel ausführen
Speichern Sie den gesamten Code als lists.py in UTF-8 im Übungsordner. Zusätzliche Pakete und Eingabedateien sind nicht erforderlich. Führen Sie python lists.py mit dem Projektinterpreter aus; unter macOS oder Ubuntu kann außerhalb einer aktivierten Umgebung python3 der passende Befehl sein.
amounts = [3500, 8000, 2500]
amounts.append(1000)
amounts[0] = 4000
removed = amounts.pop()
print(amounts, removed)
print(sorted(amounts))
print(amounts)
amounts.sort()
print(amounts)
Erwartete Ausgabe:
[4000, 8000, 2500] 1000
[2500, 4000, 8000]
[4000, 8000, 2500]
[2500, 4000, 8000]
Nach append(1000) enthält die Liste vier Elemente. Die Zuweisung an Index null ersetzt 3500 durch 4000. pop() entfernt danach die zuletzt angehängte 1000 und speichert den entfernten Wert in removed. Die erste Ausgabe zeigt deshalb drei verbleibende Beträge und daneben die entfernte 1000.
Die zweite Ausgabe stammt von einer neu sortierten Liste; die dritte zeigt, dass die ursprüngliche Reihenfolge bis dahin erhalten ist. Erst amounts.sort() sortiert das vorhandene Objekt, wie die vierte Zeile bestätigt. Lesen Sie diese Zustände nacheinander, statt die letzte Ausgabe als Ergebnis jedes einzelnen Schritts anzusehen.
Sortieren, Kopieren und gemeinsame Objekte auseinanderhalten
| Operation | Rückgabewert | Wirkung auf die ursprüngliche Liste |
|---|---|---|
items.sort() |
None |
Ändert ihre Reihenfolge. |
sorted(items) |
Eine neue Liste | Lässt ihre Reihenfolge unverändert. |
Schreiben Sie nicht items = items.sort(), wenn Sie die sortierte Liste unter diesem Namen behalten möchten. Damit weisen Sie dem Namen den Rückgabewert None zu. Sortieren Sie entweder mit items.sort() oder speichern Sie das Ergebnis von sorted(items). Die Referenz zu sorted beschreibt die neue Ergebnisliste.
other = amounts kopiert keine Liste. Es verbindet einen zweiten Namen mit demselben Objekt. Wenn Sie danach über einen der Namen ein Element ändern, ist diese Änderung auch über den anderen Namen sichtbar.
other = amounts[:] erzeugt dagegen eine neue äußere Liste. Diese Kopie ist flach: Enthält die Liste weitere veränderbare Objekte, werden diese weiterhin gemeinsam referenziert. Dasselbe gilt grundsätzlich für die enthaltenen Objekte einer mit sorted erzeugten Liste. Weder eine neue Sortierreihenfolge noch ein Slice erstellt automatisch unabhängige Kopien aller verschachtelten Inhalte. Die Dokumentation zu flachen und tiefen Kopien erläutert den Unterschied.
Leere Listen und Änderungen während einer Schleife prüfen
Bei einer leeren Liste führen sowohl der Zugriff auf Index null als auch pop() zu IndexError. remove erzeugt ValueError, wenn der gesuchte Wert fehlt. Entscheiden Sie zuerst, ob leere Eingaben erlaubt sind. Eine notwendige Mindestanzahl sollten Sie prüfen, statt erst beim zufälligen Zugriff festzustellen, dass Daten fehlen.
- Fügen Sie der ursprünglichen Liste im vollständigen Beispiel einen zusätzlichen Wert
0hinzu. Nach dem Anhängen und Entfernen von 1000 bleibt diese Null erhalten. Die Summe der verbleibenden Werte ist weiterhin 14500, die Anzahl und sortierte Reihenfolge ändern sich jedoch. Stellen Sie die Ausgangsliste wieder her. - Ersetzen Sie vorübergehend
amounts.sort()durchamounts = amounts.sort(). Die letzte Ausgabe mussNonezeigen. Stellen Sie den Originalaufruf wieder her. - Vergleichen Sie getrennt
items = [1]; items.append([2, 3])mititems = [1]; items.extend([2, 3]). Erwarten Sie eine verschachtelte Liste[1, [2, 3]]beziehungsweise die flache Folge[1, 2, 3]. - Prüfen Sie mit einer eigenen leeren Testliste
pop()und beobachten SieIndexError. Verwenden Sie dafür keine Liste mit wichtigen Anwendungsdaten.
Wenn Sie während einer Schleife aus derselben Liste Elemente entfernen, verschieben sich Positionen und einzelne Werte können übersprungen werden. Iterieren Sie je nach Absicht über eine Kopie oder bauen Sie eine neue gefilterte Liste. Beim Kopieren bleibt zu beachten, ob nur die äußere Liste oder auch verschachtelte Inhalte unabhängig sein sollen.
Ein unveränderter Gesamtbetrag beweist nicht, dass die Datenstruktur gleich geblieben ist: Ein zusätzlicher Nullbetrag oder eine andere Reihenfolge kann die Summe erhalten. Prüfen Sie daher bei Änderungen sowohl die Werte als auch Anzahl, Reihenfolge und gemeinsam verwendete Objekte.




