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.
T0m1312
User
Beiträge: 1
Registriert: Sonntag 12. Dezember 2021, 17:35

Moin,

Ich habe das Problem, dass ich mehrere Euro Beträge in einer Liste stehen habe (in diesem Vormat "13,45€") ,als String, und die ganzen beträge der Liste gerne in einen float Wert umgewandelt haben möchte.

Hat da zufällig jemand eine Idee wie ich dieses Problem lösen kann?
bin ganz neu auf dem Gebiet.

Gruß
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Du iterierst mit einer for-Schleife über die Elemente der Liste.

Dann musst du wohl über übel die Zeichenkette bearbeiten und in Format (nicht Vormat) bringen, das du dann mit float() in eine Fließkommazahl casten kannst.
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Ohne das Euro Symbol?
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@andie39: Worauf genau bezieht sich die Frage jetzt?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
snafu
User
Beiträge: 6873
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Teile es in einzelne Aufgaben auf:
- Wie komme ich an den reinen Zahlwert ohne Euro-Zeichen?
- Wie wandle ich eine Zahl vom String in einen Float um?
- Welche Probleme treten bei der Umwandlung womöglich auf?
- Was muss ich am String ändern, damit die Umwandlung klappt?

Und wenn es für dein Beispiel klappt, dann halt noch herausfinden, wie man alle Elemente einer Liste durchgeht und die Schritte anwendet.

Die Lösungen dazu stehen alle im offiziellen Python-Tutorial oder man googelt sie.
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

__blackjack__ hat geschrieben: Sonntag 12. Dezember 2021, 18:52 @andie39: Worauf genau bezieht sich die Frage jetzt?
Auf die Frage des Threaderstellers.
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@andie39: Wird nicht wirklich klarer die Frage.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

T0m1312 hat geschrieben: Sonntag 12. Dezember 2021, 17:46 Moin,

Ich habe das Problem, dass ich mehrere Euro Beträge in einer Liste stehen habe (in diesem Vormat "13,45€") ,als String, und die ganzen beträge der Liste gerne in einen float Wert umgewandelt haben möchte.

Hat da zufällig jemand eine Idee wie ich dieses Problem lösen kann?
bin ganz neu auf dem Gebiet.

Gruß
Schau mal hier:

Code: Alles auswählen

liste = ["13.25€", "12.50€","105.60€","45.87€"]

liste_neu =[]

for i in liste:
    a = float(i.split("€")[0])
    liste_neu.append(a)

print(liste_neu)
Der print-Befehl ist nicht nötig aber er zeigt, dass jetzt in der neuen Liste die Werte stimmen als float und ohne €.

Ich bin selber ein Frischling:
Daher vorsicht.
Ggf kann ein Profi hier zustimmen oder korrigieren.
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@andie39: Ich finde `split()` nicht so passend, denn man möchte ja eher etwas entfernen und nicht aufteilen. `strip()` bietet sich da IMHO eher an. Und das reicht nicht ganz für das was der Fragesteller da als Ausgangsdaten hat. Die "13,45€" aus dem Beitrag würden mit dem Code noch nicht ganz funktionieren.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

__blackjack__ hat geschrieben: Sonntag 12. Dezember 2021, 21:20 @andie39: Ich finde `split()` nicht so passend, denn man möchte ja eher etwas entfernen und nicht aufteilen. `strip()` bietet sich da IMHO eher an. Und das reicht nicht ganz für das was der Fragesteller da als Ausgangsdaten hat. Die "13,45€" aus dem Beitrag würden mit dem Code noch nicht ganz funktionieren.
Verstehe.
Man hätte aber ja eine neue Liste die es nicht enthält.
Strip klappt irgendwie nicht richtig bei mir.
Aber Strip funktioniert ja auch mit strings nicht listen oder?
Alternativ wie wäre es mit:

Code: Alles auswählen

liste = ["13.25€", "12.50€","105.60€","45.87€"]

liste_neu =[]

for i in liste:
    liste_neu = [s.replace("€", "") for s in liste]

print(liste_neu)
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

andie39 hat geschrieben: Sonntag 12. Dezember 2021, 22:09
__blackjack__ hat geschrieben: Sonntag 12. Dezember 2021, 21:20 @andie39: Ich finde `split()` nicht so passend, denn man möchte ja eher etwas entfernen und nicht aufteilen. `strip()` bietet sich da IMHO eher an. Und das reicht nicht ganz für das was der Fragesteller da als Ausgangsdaten hat. Die "13,45€" aus dem Beitrag würden mit dem Code noch nicht ganz funktionieren.
Verstehe.
Man hätte aber ja eine neue Liste die es nicht enthält.
Strip klappt irgendwie nicht richtig bei mir.
Aber Strip funktioniert ja auch mit strings nicht listen oder?
Alternativ wie wäre es mit:

Code: Alles auswählen

liste = ["13.25€", "12.50€","105.60€","45.87€"]

liste_neu =[]

for i in liste:
    liste_neu = [s.replace("€", "") for s in liste]

print(liste_neu)
Da ist ja Blödsinn drin

Es geht doch kürzer:

Code: Alles auswählen

liste = ["13.25€", "12.50€","105.60€","45.87€"]


liste_neu = [s.replace("€", "") for s in liste]

print(liste_neu)
Die for Schleife war ja sinnlos.
Benutzeravatar
snafu
User
Beiträge: 6873
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Die Werte liegen ursprünglich nach wie vor in der deutschen Schreibweise vor, also dem Komma als Dezimaltrenner und nicht mit dem Punkt. Die Ausgangsdaten hier einfach anzupassen, geht ja nicht immer. Also muss man da wohl noch einen Schritt einfügen. Floats sind es übrigens auch noch nicht. ;)
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@andie39: „Klappt irgendwie nicht richtig bei mir.“ ist keine sinnvolle Fehlerbeschreibung. Bei mir klappt's. Und `replace()` drückt ja auch wieder semantisch nicht das aus was man tatsächlich eigentlich nur machen will. Denn `replace()` ersetzt in der gesamten Zeichenkette. Eigentlich will man ja nur rechts "€" entfernen.

Code: Alles auswählen

In [81]: [text.rstrip("€") for text in amount_texts]                                   
Out[81]: ['13,25', '12,50', '105,60', '45,87']
Um letztlich etwas zu bekommen mit dem man rechnen kann, fehlen allerdings noch zwei Schritte, denn es soll ja [13.25, 12.5, 105.6, 45.87] weiterverarbeitet werden.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

__blackjack__ hat geschrieben: Montag 13. Dezember 2021, 04:31 @andie39: „Klappt irgendwie nicht richtig bei mir.“ ist keine sinnvolle Fehlerbeschreibung. Bei mir klappt's. Und `replace()` drückt ja auch wieder semantisch nicht das aus was man tatsächlich eigentlich nur machen will. Denn `replace()` ersetzt in der gesamten Zeichenkette. Eigentlich will man ja nur rechts "€" entfernen.

Code: Alles auswählen

In [81]: [text.rstrip("€") for text in amount_texts]                                   
Out[81]: ['13,25', '12,50', '105,60', '45,87']
Um letztlich etwas zu bekommen mit dem man rechnen kann, fehlen allerdings noch zwei Schritte, denn es soll ja [13.25, 12.5, 105.6, 45.87] weiterverarbeitet werden.
Nun wie gesagt ich bin ja noch ganz am Anfang.

Darum der Hinweis auf die Profis. ;)

Aber ich weiß warum es nicht geklappt hat, siehe Snafu. Ich hatte . statt , als Dezimaltrenner.
So funktioniert dann das hier:

Code: Alles auswählen

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

liste_neu =[]

for i in liste:
    a = i.strip("€")
    liste_neu.append(a)

print(liste_neu)

Du hast Recht, float geht dann aber nicht, weil die Kommata noch da sind.
Also würde ich meinen müsste man die Kommata ersetzen?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja, mit der replace Methode zb.
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

__deets__ hat geschrieben: Montag 13. Dezember 2021, 12:00 Ja, mit der replace Methode zb.
Ich habe da mal etwas versucht:

Code: Alles auswählen

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

liste_neu =[]

for i in liste:
    a = i.strip("€")
    liste_neu.append(a)
    

for i in liste_neu:
	liste_neu = [s.replace(",", ".") for s in liste_neu
	
	
print(liste_neu)

[/python]

Bekomme jetzt aber einen Syntax Fehler bei printe(liste_neu)
verstehe aber nicht warum…
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@andie39: Zu jeder öffnenden Klammer gehört eine schließende. Insbesondere bedeutet das, dass die Anzahl der öffnenden und schließenden Klammern gleich sein muss. Und jetzt zähl mal deine Klammern...
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

pillmuncher hat geschrieben: Montag 13. Dezember 2021, 12:36 @andie39: Zu jeder öffnenden Klammer gehört eine schließende. Insbesondere bedeutet das, dass die Anzahl der öffnenden und schließenden Klammern gleich sein muss. Und jetzt zähl mal deine Klammern...
…..hab es. :oops:
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Dann würde ich mal in den Ring werfen:

Code: Alles auswählen

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

liste_neu =[]
liste_neu2 =[]
for i in liste:
    a = i.strip("€")
    liste_neu.append(a)
    

for i in liste_neu:
	liste_neu = [s.replace(",", ".") for s in liste_neu]
	
for i in liste_neu:
	a = float(i)
	liste_neu2.append(a)

Jetzt sind in der neuen liste_neu2 alle Werte ohne € und als Float Wert, mit denen man auch rechnen kann.
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Jetzt machst du das aber in 3 verschiedenen Schleifen.
Das könnte man auch in einer einzigen tun.
Antworten