.Replace in einer Liste

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
comuniomeister
User
Beiträge: 5
Registriert: Donnerstag 4. Oktober 2018, 14:41

Hallo liebe Python-Programmierer,

ich bin relativ neu in Python und habe eine Frage bzgl. einer Liste. Ich möchte bei der folgenden Liste

Code: Alles auswählen

 Liste= ['787 mg', '1.082 mg', '735 mg', '387 mg', '284 mg', '748 mg', '529 mg'] 
die String Einträge erst die Einheit "mg" entfernen und anschließend die String-Nummern mit der

Code: Alles auswählen

int()
-Funktion in Integer umwandeln.

Ich habe es mit dem Code

Code: Alles auswählen

Liste2=[]
for j in Liste:
    s=j.replace(" mg", "")
    Liste2+=s
print (ListeF)
probiert, allerdings wird mir dann die Liste in Form von

Code: Alles auswählen

['7', '8', '7', '1', '.', '0', '8', '2', '7', '3', '5', '3', '8', '7', '2', '8', '4', '7', '4', '8', '5', '2', '9']
ausgespuckt. Könnt Ihr mir aushelfen? Vielen lieben Dank.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dir fehlt die Wandlung zum Integer. Das machst du ja nicht. Ein simples int(s) sollte es tun.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Naja und man sollte bei ``+=``, was der `extend()`-Methode entspricht keine Zeichenkette angeben die dann als Sequenz von einzelnen Zeichen angesehen wird. ``+=`` habe ich bei Listen glaube ich noch nie verwendet. Man will hier `append()`. Oder gleich eine „list comprehension“ um `Liste2` zu erstellen. Und die dann vielleicht auch sinnvoll und den Namenskonventionen entsprechend benennen.

`replace()` ist hier IMHO auch die falsche Operation. Der Effekt ist zwar das gewünschte, aber eigentlich möchte man ja den Teil hinter der Zahl abtrennen und nichts ersetzen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
comuniomeister
User
Beiträge: 5
Registriert: Donnerstag 4. Oktober 2018, 14:41

Danke für eure Tipps! Ich werde heute Abend direkt eure Tipps versuchen umzusetzen.
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

ich würde das so machen:

Code: Alles auswählen

Liste= ['787 mg', '1.082 mg', '735 mg', '387 mg', '284 mg', '748 mg', '529 mg']
Liste2 = []
for index in Liste:
    hallo, moin = index.split(' ')
    Liste2.append(int(float(hallo)))

print Liste2
das geht aber bestimmt noch besser....
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Entweder split() nutzen und mit dem Element am Index 0 arbeiten oder mit rsplit() das mg abtrennen. Falls aber auch g und kg vorkommen, dann definitiv lieber splitten.

Übrigens wird noch ein Problem auftauchen, weil int() nicht mit dem Punkt klarkommt. Hier würde ich mir wohl mit replace() behelfen.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD-OL: was besser geht ist, hallo und moin in value und unit umzubenennen. Liste in inputs und Liste2 in outputs. index -> quantity

Außerdem denke ich, dass »1.082« anders zu interpretieren ist.
comuniomeister
User
Beiträge: 5
Registriert: Donnerstag 4. Oktober 2018, 14:41

Danke an jeden einzelnen, der kommentiert hat. Ihr habt mir sehr geholfen und ich habe versucht jeden Rat zu beherzigen. In meinem Ursprungscode habe ich mithilfe von beautifulsoup auf einer Nährwert-Webseite die einzelnen Aminosäurendaten ausgelesen, um diese dann in Excel reinzukopieren. Leider kamen bzgl. der Werte eben mg-Einheiten, Punkte und Kommatas vor. Deswegen erst einmal diese Lösung

Code: Alles auswählen

input= Liste= ['787 mg', '1.082 mg', '735 mg', '387 mg', '284 mg', '748 mg', '529 mg'] 
input2=[]
output=[]
for i in input:
    s=i.replace(",", "")
    s = s.replace(".", "")
    input2.append(s)
for quantity in input2:
    value, unit = quantity.split(' ')
    output.append(int(float(value)))
for number in output:
    print(number)
    
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Kommas zu ignorieren hat einen ähnlich negativen Effekt, wie den Punkt nicht zu ignorieren.

Am besten für die Konvertierung eine eigene Funktion schreiben.

Code: Alles auswählen

def convert(quantity):
    value, unit = quantity.split()
    if unit != 'mg':
        raise ValueError(unit)
    return int(float(value.replace('.', '').replace(',', '.'))

inputs = ['787 mg', '1.082 mg', '735 mg', '387 mg', '284 mg', '748 mg', '529 mg'] 
outputs = list(map(convert, inputs))
comuniomeister
User
Beiträge: 5
Registriert: Donnerstag 4. Oktober 2018, 14:41

Sirius3 hat geschrieben: Donnerstag 4. Oktober 2018, 21:30 Kommas zu ignorieren hat einen ähnlich negativen Effekt, wie den Punkt nicht zu ignorieren.

Am besten für die Konvertierung eine eigene Funktion schreiben.

Code: Alles auswählen

def convert(quantity):
    value, unit = quantity.split()
    if unit != 'mg':
        raise ValueError(unit)
    return int(float(value.replace('.', '').replace(',', '.'))

inputs = ['787 mg', '1.082 mg', '735 mg', '387 mg', '284 mg', '748 mg', '529 mg'] 
outputs = list(map(convert, inputs))
Hallo Sirius,

danke für deine Antwort. Ich habe mir den Code angeguckt und ausprobiert. Er funktioniert auch ohne die replace.replace Folge und die if Bedingung. Kannst du mir erklären, was genau

Code: Alles auswählen

 raise ValueError(unit) 
macht? Ich habe schon nach beiden Schlagwörtern gegoogelt, aber ich verstehe den Code noch nicht vollständig. Vielen Dank.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@comuniomeister: Das funktioniert nicht ohne `replace()`. Zumindest eines von beiden ist bei den Testdaten zwingend notwendig. Es sei denn 1 wäre tatsächlich das gewünschte Ergebnis für den zweiten Wert in der Eingabeliste.
“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

@comuniomeister: ergänzend zu __blackjack__ brauchst Du die if-Abfrage um zu gewährleisten, dass die Zahlen in 'outputs' alle die gleiche Dimension haben. Sonst sind sie aussagelos.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

`raise` wirft eine Ausnahme, also einen Fehler, falls die Einheit nicht 'mg' ist. Fehlerhafte Daten sollten nie einfach so in korrekt aussehende Daten umgewandelt werden; durch die Ausnahme kann man dann nachsehen, was denn schief läuft.
comuniomeister
User
Beiträge: 5
Registriert: Donnerstag 4. Oktober 2018, 14:41

Vielen vielen Dank für eure Hilfe, ich habe es verstanden :)
Antworten