mitmario.dev

Listen umbauen

Python Sandbox 4 Min Lesezeit 6 BeispieleLektion 6 von 8

Eine Kasse speichert Preise in Cent, weil sich ganze Zahlen nicht verrechnen wie Kommazahlen. Auf dem Bildschirm willst du aber Euro sehen. Aus der einen Liste soll also eine zweite werden, in der jeder Betrag umgerechnet ist. Oder eine, in der nur die großen Beträge stehen. Oder beides.

So etwas kommt beim Arbeiten mit Daten ständig vor, und Python hat dafür eine eigene Schreibweise. Es geht aber auch mit dem, was du schon kennst.

Eine leere Liste, eine Schleife, ein append

Cent in Euro mit einer Schleife
cent = [249, 119, 699, 1299, 45]
euro = []
for betrag in cent:
    euro.append(betrag / 100)
print(euro)

Das Muster hat drei Teile, und alle kennst du aus den letzten Lektionen. Vor der Schleife steht eine leere Liste für das Ergebnis. Dann kommt eine Schleife über die alte Liste. Und darin steht ein append mit dem, was aus jedem Eintrag werden soll, hier der Betrag geteilt durch 100.

Die alte Liste bleibt dabei, wie sie war. Am Ende gibt es zwei, nämlich cent mit den ursprünglichen Werten und euro mit den umgerechneten, Eintrag für Eintrag in derselben Reihenfolge. Der Aufbau ist derselbe wie bei der Summe aus Lektion 4.3. Nur wird diesmal keine Zahl gesammelt, sondern eine Liste.

Aussieben

Nur die großen Beträge
cent = [249, 119, 699, 1299, 45]
gross = []
for betrag in cent:
    if betrag > 500:
        gross.append(betrag / 100)
print(gross)

Soll nicht jeder Eintrag mit, kommt ein if vor das append. Dann landet in der neuen Liste nur, was die Bedingung erfüllt. Hier ist das alles über 5 Euro, also über 500 Cent. Umrechnen und Aussieben passieren dabei in einem Durchgang.

Gefragt wird hier nach dem Wert in Cent, also vor dem Umrechnen. betrag / 100 > 5 hieße dasselbe, denn 5 Euro sind genau 500 Cent. Anders ist es, wenn die Umrechnung den Wert wirklich ändert. Wenn du Preise über 10 Euro aussiebst und dabei die Mehrwertsteuer aufschlägst, musst du wissen, ob die 10 Euro vor oder nach der Steuer gemeint sind. Ein Artikel für 9 Euro netto kostet brutto 10,71 Euro. Je nach Lesart ist er also drin oder draußen.

Die Schleife in einer Zeile

Dasselbe in einer Zeile
cent = [249, 119, 699, 1299, 45]
euro = [betrag / 100 for betrag in cent]
gross = [betrag / 100 for betrag in cent if betrag > 500]
print(euro)
print(gross)

Weil dieses Muster so oft vorkommt, gibt es eine Kurzform dafür, die List Comprehension. Einen deutschen Namen benutzt dafür kaum jemand. [betrag / 100 for betrag in cent] macht genau dasselbe wie die Schleife im ersten Beispiel, und [betrag / 100 for betrag in cent if betrag > 500] dasselbe wie die im zweiten.

Am leichtesten liest du sie von der Mitte aus. for betrag in cent ist die Schleife und if betrag > 500 die Bedingung. Was ganz vorn steht, betrag / 100, wird bei jedem Treffer an die neue Liste angehängt. Die eckigen Klammern außen sagen, dass am Ende eine Liste herauskommt. Es ist die Schleife von oben, nur zusammengeschoben.

Ein Rezept für acht statt vier
zutaten = ["Mehl", "Eier", "Milch", "Zucker"]
mengen = [250, 3, 500, 40]
doppelt = [menge * 2 for menge in mengen]
print(doppelt)
for zutat, menge in zip(zutaten, doppelt):
    print(f"{zutat}: {menge}")

Eine List Comprehension funktioniert mit allem, was eine Schleife durchgehen kann, und vorn darf jede Rechnung stehen. So wird aus einem Rezept für vier Personen eins für acht. Mit zip stehen Zutat und neue Menge danach wieder nebeneinander.

Lesbar bleibt die Kurzform, solange sie in eine Zeile passt und eine einzige Sache tut. Wenn ein elif dazukommt, ein zweites if oder eine Rechnung, über die man nachdenken muss, ist die Schleife mit append die bessere Wahl. Sie ist länger. Dafür steht jeder Schritt in einer eigenen Zeile, und im Reiter Debug siehst du jeden einzeln.

Nicht streichen, während man durchläuft

Streichen während der Schleife
preise = [1.99, 0.49, 0.89, 4.99, 0.29]
for preis in preise:
    if preis < 1:
        preise.remove(preis)
print(preise)

Wenn du nur die billigen Preise loswerden willst, liegt es nahe, sie einfach aus der Liste zu streichen, während die Schleife sie durchgeht. Das Ergebnis sieht zuerst richtig aus und ist es nicht. Die 0,89 Euro sind stehen geblieben.

Das liegt daran, wie for eine Liste durchgeht, nämlich Position für Position. Auf Position 1 steht 0,49, und das remove nimmt sie heraus. Dadurch rutscht alles dahinter eine Stelle nach vorn, und die 0,89 steht jetzt auf Position 1. Die Schleife macht aber mit Position 2 weiter, und dort steht inzwischen 4,99. Die 0,89 kommt nie dran.

Im Reiter Debug kannst du es nachsehen. preis ist nacheinander 1.99, 0.49, 4.99 und 0.29, und die 0.89 fehlt in der Reihe.

Eine neue Liste statt Streichen
preise = [1.99, 0.49, 0.89, 4.99, 0.29]
preise = [preis for preis in preise if preis >= 1]
print(preise)

Die Lösung ist der Kern dieser Lektion. Statt die alte Liste umzubauen, baust du eine neue. Die List Comprehension legt alles ab einem Euro in eine neue Liste, und die bekommt danach den alten Namen. Unter der laufenden Schleife verschiebt sich also nichts.

Was die Aufgabe will

Im Laden werden Nettopreise ohne Mehrwertsteuer zu Bruttopreisen mit 19 Prozent. Mit muss dabei nur, was netto mehr als 10 Euro kostet. Die Preise kommen wieder aus einer Datei, und der Startcode liest sie ein.

Zum Mitnehmen

Eine neue Liste aus einer alten entsteht mit einer Schleife und append. Ein if davor siebt aus. Die List Comprehension schreibt dasselbe in eine Zeile und bleibt lesbar, solange sie kurz ist. Wer in einer laufenden Schleife streicht, überspringt Einträge.

Jetzt du

Basis Konto, kostenlos

Zu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.

Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.

In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.

Was in dieser Lektion steckt

  • Artikel mit 6 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.

  • Aufgabe, dein Code läuft auf einem Server

    Öffnet sich mit dem Basis Konto.