Float aus mehreren Listenelementen erstellen

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.
Antworten
DrRocket
User
Beiträge: 30
Registriert: Freitag 11. Mai 2018, 15:11

Hallo zusammen,

wie kann ich aus einer Liste wie ['28', '365', '00'] eine Dezimalzahl 28365,00 erstellen? Dabei ist immer das letzte Element der Nachkommateil der Dezimalzahl. Könnte also mit [-1:] identifiziert werden. Der Teil vor dem Komma entsprechend mit [:-1]. Nur wie verknüpfe ich die einzelnen Elemente zu einer Dezimalzahl?

Grüße
Thomas
Feind
User
Beiträge: 7
Registriert: Montag 19. Februar 2018, 18:38

In dem Du alle Elemente außer das letzte in einem String zusammen "addierst" und anschließend den Nachkommaanteil hinzufügst. Diesen Wert dann in ein float casten und Du bist fertig. Ob da immer sinnvolle Sachen rauskommen, sei dahin gestellt. Aber über mögliche Werte schweigt die Aufgabenstellung.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

parts = ['28', '365', '00']
pre = ''.join(parts[:-1])
post = parts[-1]
result = float(f'{pre}.{post}')
In welchem Zusammenhang steht das Problem denn? Vielleicht gibt es eine schönere Lösung dafür.
DrRocket
User
Beiträge: 30
Registriert: Freitag 11. Mai 2018, 15:11

Danke schonmal für die Antworten. Ich erstelle mir einen Webcrawler und extrahiere einen Preis aus einem html-tag. Der Preis ist eingebtetet in Text, Euro-Sonderzeichen und hat auch Leerzeichen. Für das Beispiel oben steht im html-tag " 28.365,00 € ". Mit folgendem Code entnehme ich nur die Ziffern aus dem Tag:

Code: Alles auswählen

self.kaufpreis = re.findall(r"\d+", kaufpreis.strip())
Dadurch erhalte ich eine Liste mit mehreren Elementen (hier ['28', '365', '00']). Das letzte Element ist immer der Nachkommateil. Je nach Prei (1000er-Trennzeichen), kann es beliebig viele Elemente davor geben.

@snafu: Danke für den Hinweis mit join. Hatte die Methode nicht mehr auf dem Schirm.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ein alternativer Ansatz wäre ein etwas erweiterter regulärer Ausdruck und die Verwendung des locale-Moduls:

Code: Alles auswählen

from locale import atof
price = atof(re.search(r'(\d+[.,]?)+', text).group())
Voraussetzung ist, dass man seine Locale-Einstellungen passend auf Deutsch gesetzt hat. Entweder von außen per Umgebungsvariable (z.B. LANG unter Linux) oder innerhalb von Python mittels locale.setlocale().

Dies kommt auch mit Tausender-Trennzeichen klar.

Der reguläre Ausdruck liest sich übrigens so: Suche ein oder mehrere Ziffern (\d+), eventuell gefolgt von einem Punkt oder einem Komma ([.,]?). Wiederhole diesen Ablauf für den gesamten Text((...)+). Die Ergebnisse werden dabei direkt als ein String zusammengefügt. Punkte und Komma bleiben erhalten und werden erst in atof() behandelt.
Zuletzt geändert von snafu am Mittwoch 5. Dezember 2018, 10:39, insgesamt 2-mal geändert.
__deets__
User
Beiträge: 14538
Registriert: Mittwoch 14. Oktober 2015, 14:29

Locale ist ätzend. Dadurch das es globalen Zustand setzt, kann man nur EINE locale gleichzeitig setzen.

Ich würde immer auf Babel setzen: http://babel.pocoo.org/en/latest/numbers.html
Antworten