Liste auslesen und Elemente bearbeiten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

sparrow hat geschrieben: Montag 13. Dezember 2021, 13:17 Jetzt machst du das aber in 3 verschiedenen Schleifen.
Das könnte man auch in einer einzigen tun.
Vermutlich. Ich grübel und probiere gerade, klappt noch nicht.
Ich versuche es weiter
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Wenn du dir deine erste Schleife anschaust, dann bindest du jedes einzelne Element an den Namen "a". Was hindert dich daran, die anderen Änderungen an "a" auch durchzuführen, bevor du das Element an die neue Liste anhängst?
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

@sparrow: ich zähle vier Schleifen, wobei die mittleren beiden besonders interessant sind.

@andie39: wenn man an eine Schleifenvariable `i` etwas anderes bindet, als aufsteigende ganze Zahlen, dann ist das für jeden Leser verwirrend. Auch sollte ein Variablennamen mehr verraten, als nur dass es sich um eine Liste handelt oder dass es eine neue oder zweifach neue Liste ist. Was ist denn der Inhalt jeder dieser Listen? Variablen werden erst dann initialisiert, wenn man sie auch braucht und nicht schon neun Zeilen davor, wie es bei `liste_neu2` der Fall ist.
Wenn die Laufvariable einer Schleife gar nicht gebraucht wird, dann ist das oft ein Zeichen, dass da was nicht stimmt.
Zuletzt geändert von Sirius3 am Montag 13. Dezember 2021, 13:47, insgesamt 2-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

@Sirius3: Da hast du recht. Aber ich glaube list comprehensions überfordern gerade noch. Mal gucken, ob wir das am Ende herleiten können :)
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Nun wie gesagt: Ich bin ersr ganz am Anfang, dachte aber das ich diese Aufgabe doch schon hinbekomme.
Ich muss aber sagen:
Nein leider nicht.

In einer Schleife bekomme ich es nicht hin.
Garantiert irgendein Gedankenfehler aber ich komm leider nicht drauf.
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

andie39: Als Tipp: Man muss nicht jeden Zwischenschritt an einen Namen binden. Wenn str.strip() einen geänderten str zurück gibt, kann man darauf natürlich die nächste Funktion aufrufen. a.replace("x", "y").strip("@") ruft auf a erst replace mit den Parametern "x" und "y" auf und auf das Ergebnis strip mit dem Parameter "@".
Und wenn du dir jetzt anschaust, wie list comprehensions funktionieren, kann man das in einer einzigen Zeile lösen.
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

sparrow hat geschrieben: Montag 13. Dezember 2021, 14:21 andie39: Als Tipp: Man muss nicht jeden Zwischenschritt an einen Namen binden. Wenn str.strip() einen geänderten str zurück gibt, kann man darauf natürlich die nächste Funktion aufrufen. a.replace("x", "y").strip("@") ruft auf a erst replace mit den Parametern "x" und "y" auf und auf das Ergebnis strip mit dem Parameter "@".
Und wenn du dir jetzt anschaust, wie list comprehensions funktionieren, kann man das in einer einzigen Zeile lösen.

Ist mir immer noch nicht klar, wenn ich die Schleife laufen lasse und mit strp das € entferne, muss der neue Wert ja in eine neue Liste gepackt werden, meine ich zumindest.
ich bekomme die alten Werte nicht überschrieben.

Mag sein, dass ich es verstehen würde wenn ich es in dem Code selber einmal sehen würde, aber so sind das leider bömische Dörfer.......
Die Tatsache das ich nicht wirklich verstehe was du meinst, sagt mir:

Ich sollte noch einmal von vorne anfangen.
Das Grundverständnis was ich dachte, dass ich es hätte, scheint nicht der Fall zu sein.
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

@andie39: Der Ansatz mit den drei Schleifen ist erst einmal nicht schlecht, denn so kannst Du Schritt für Schritt vorgehen:

Code: Alles auswählen

liste = ["13,25€", "12,50€","105,60€","45,87€"]

clear_euro = []
for entry in liste:
    stripped_entry = entry.rstrip("€")
    clear_euro.append(stripped_entry)

no_commas = []
for entry in clear_euro:
    no_comma = entry.replace(",", ".")
    no_commas.append(no_comma)
    
numbers = []
for entry in no_commas:
    number = float(entry)
    numbers.append(number)
    
print(numbers)
Das ist für Anfänger leicht zu verstehen. Mit etwas Erfahrung erkennt man, das sich jede dieser Schleifen in kompakterer Form als List-Comprehension schreiben lässt:

Code: Alles auswählen

liste = ["13,25€", "12,50€","105,60€","45,87€"]

clear_euro = [entry.rstrip("€") for entry in liste]
clear_comma = [entry.replace(",", ".") for entry in clear_euro]
numbers = [float(entry) for entry in clear_comma]

print(numbers)
Und auch diese lassen sich durch Substitution noch weiter zusammenfassen, so dass am Schluß ein Einzeiler entsteht:

Code: Alles auswählen

liste = ["13,25€", "12,50€","105,60€","45,87€"]

numbers = [float(entry.rstrip("€").replace(",", ".")) for entry in liste]

print(numbers)
Das bedeutet aber nicht, dass Du immer alles zusammenquetschen solltest. Gerade wenn man noch unsicher ist und gerne schrittweise nachvollziehen möchte was passiert, kann es sinnvoll sein, den Code zunächst auf mehrere Zeilen zu verteilen, um das Verständnis zu erleichtern.
Zuletzt geändert von kbr am Montag 13. Dezember 2021, 14:39, insgesamt 1-mal geändert.
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@andie39: Naja, statt *mehrere* Schleifen nacheinander zu schreiben, die mit dem aktuellen Element immer *eine* Sache machen, würde man *eine* Schleife schreiben, die mit dem aktuellen Element nacheinander *mehrere* Sachen macht.

Code: Alles auswählen

    neue_liste = []
    for element in alte_liste:
        element = mach_was(element)
        neue_liste.append(element)

    noch_eine_neue_liste = []
    for element in neue_liste:
        element = mach_noch_was(element)
        noch_eine_neue_liste.append(element)
    
    hoffentlich_die_letzte_neue_liste = []
    for element in noch_eine_neue_liste:
        element = nachpolieren_damit_es_schoen_glaenzt(element)
        hoffentlich_die_letzte_neue_liste.append(element)

    # =>
    
    neue_liste = []
    for element in alte_liste:
        element = mach_was(element)
        element = mach_noch_was(element)
        element = nachpolieren_damit_es_schoen_glaenzt(element)
        neue_liste.append(element)
Und man ersetzt selten tatsächlich irgendwas in einer vorhandenen Liste, sondern erstellt eine neue Liste. Die dann vielleicht die alte ersetzt.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

kbr hat geschrieben: Montag 13. Dezember 2021, 14:37 @andie39: Der Ansatz mit den drei Schleifen ist erst einmal nicht schlecht, denn so kannst Du Schritt für Schritt vorgehen:

Code: Alles auswählen

liste = ["13,25€", "12,50€","105,60€","45,87€"]

clear_euro = []
for entry in liste:
    stripped_entry = entry.rstrip("€")
    clear_euro.append(stripped_entry)

no_commas = []
for entry in clear_euro:
    no_comma = entry.replace(",", ".")
    no_commas.append(no_comma)
    
numbers = []
for entry in no_commas:
    number = float(entry)
    numbers.append(number)
    
print(numbers)
Das ist für Anfänger leicht zu verstehen. Mit etwas Erfahrung erkennt man, das sich jede dieser Schleifen in kompakterer Form als List-Comprehension schreiben lässt:
Ah, jetzt kommen wir der Sache näher, ja so ähnlich hatte ich das ja auch.
Weniger sauber und klar im Bezug auf die Variabeln, dass hier ist sauberer, aber vom Grundsatz her so ähnlich.

kbr hat geschrieben: Montag 13. Dezember 2021, 14:37

Code: Alles auswählen

liste = ["13,25€", "12,50€","105,60€","45,87€"]

clear_euro = [entry.rstrip("€") for entry in liste]
clear_comma = [entry.replace(",", ".") for entry in clear_euro]
numbers = [float(entry) for entry in clear_comma]

print(numbers)
Das daraus abgeleitet verstehe ich auch noch.
Der dritte Schritt ist für mich noch etwas zu kompliziert.

Danke!!!!
Antworten