Seite 1 von 1
Float aus mehreren Listenelementen erstellen
Verfasst: Mittwoch 5. Dezember 2018, 08:28
von DrRocket
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
Re: Float aus mehreren Listenelementen erstellen
Verfasst: Mittwoch 5. Dezember 2018, 08:44
von Feind
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.
Re: Float aus mehreren Listenelementen erstellen
Verfasst: Mittwoch 5. Dezember 2018, 09:00
von snafu
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.
Re: Float aus mehreren Listenelementen erstellen
Verfasst: Mittwoch 5. Dezember 2018, 09:10
von DrRocket
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.
Re: Float aus mehreren Listenelementen erstellen
Verfasst: Mittwoch 5. Dezember 2018, 10:32
von snafu
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.
Re: Float aus mehreren Listenelementen erstellen
Verfasst: Mittwoch 5. Dezember 2018, 10:35
von __deets__
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