2d list: wie konvertiert man string nach float in a pythonic way

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
kkornfield
User
Beiträge: 13
Registriert: Mittwoch 29. Dezember 2021, 08:38

Hi
wie wurdet ihr das nach float bringen:
x= [["1" , "2", "3"],["4" , "5", "6"],["7" , "8.1", "9"]]
danke
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kkornfield: Grundlagentutorial Schleifen oder „list comprehension“ und die `float()`-Funktion. Wenn man cool sein will, kann man noch `list()` und `map()` in den Mix werfen. Und falls man aus irgendwelchen Gründen sowieso schon das `glom`-Package als Abhängigkeit hat, dessen `glom()`-Funktion:

Code: Alles auswählen

In [631]: glom(xs, [[float]])
Out[631]: [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.1, 9.0]]
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Und ohne glom hier auf die Schnelle:

Code: Alles auswählen

x = [["1" , "2", "3"],["4" , "5", "6"],["7" , "8.1", "9"]]

def get_float(items):
    for item in items:
        if isinstance(item, list):
            yield from get_float(item)
        else:
            yield float(item)
            
list(get_float(x))
Allerdings linearisiert das die Sequenz. Daran hatte ich – gleichfalls auf die Schnelle – nicht gedacht.
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

oder einfach:

Code: Alles auswählen

ur_array= [["1" , "2", "3"],["4" , "5", "6"],["7" , "8.1", "9"]]

float_array = []
for liste in ur_array:
    neue_liste = []
    for element in liste:
        zahl = float(element)        
        neue_liste.append(zahl)
    float_array.append(neue_liste)
Gruss Peter
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Listen als `array` zu benennen ist keine gute Idee. Es gibt auch Arrays, damit sind aber in der Regel Numpy-Arrays gemeint wenn man über Python spricht. Grunddatentypen sollten auch nicht in Namen vorkommen. Und eigentlich ist das mit „list comprehensions“ ein kleiner Einzeiler. Mit `map()` und `list()` kann man sich dann sogar noch Namen einsparen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

... oder so:

Code: Alles auswählen

x = [["1" , "2", "3"],["4" , "5", "6"],["7" , "8.1", "9"]]
[[float(item) for item in items] for items in x]
Wobei ich nested list-comprehension nicht so mag, da diese schnell zur Unübersichtlichkeit neigen.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich würde sagen, das geht nicht, sagt jedenfalls mein Python:

Code: Alles auswählen

float([["1" , "2", "3"],["4" , "5", "6"],["7" , "8.1", "9"]])
TypeError: float() argument must be a string or a number, not 'list'
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Die Idee mit list und map ist auch nicht schlecht, dann ist die LC nicht mehr nested ;)

Code: Alles auswählen

[list(map(float, items)) for items in x]
Aber keine Ahnung, ob es nun serialisiert, oder die Struktur beibehalten werden soll.
Antworten