Seite 1 von 1

.Replace in einer Liste

Verfasst: Donnerstag 4. Oktober 2018, 14:54
von comuniomeister
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.

Re: .Replace in einer Liste

Verfasst: Donnerstag 4. Oktober 2018, 15:28
von __deets__
Dir fehlt die Wandlung zum Integer. Das machst du ja nicht. Ein simples int(s) sollte es tun.

Re: .Replace in einer Liste

Verfasst: Donnerstag 4. Oktober 2018, 15:38
von __blackjack__
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.

Re: .Replace in einer Liste

Verfasst: Donnerstag 4. Oktober 2018, 15:43
von comuniomeister
Danke für eure Tipps! Ich werde heute Abend direkt eure Tipps versuchen umzusetzen.

Re: .Replace in einer Liste

Verfasst: Donnerstag 4. Oktober 2018, 17:06
von DMD-OL
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....

Re: .Replace in einer Liste

Verfasst: Donnerstag 4. Oktober 2018, 17:30
von snafu
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.

Re: .Replace in einer Liste

Verfasst: Donnerstag 4. Oktober 2018, 17:34
von Sirius3
@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.

Re: .Replace in einer Liste

Verfasst: Donnerstag 4. Oktober 2018, 21:07
von comuniomeister
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)
    

Re: .Replace in einer Liste

Verfasst: Donnerstag 4. Oktober 2018, 21:30
von Sirius3
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))

Re: .Replace in einer Liste

Verfasst: Donnerstag 4. Oktober 2018, 23:12
von comuniomeister
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.

Re: .Replace in einer Liste

Verfasst: Freitag 5. Oktober 2018, 00:06
von __blackjack__
@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.

Re: .Replace in einer Liste

Verfasst: Freitag 5. Oktober 2018, 07:36
von kbr
@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.

Re: .Replace in einer Liste

Verfasst: Freitag 5. Oktober 2018, 07:51
von Sirius3
`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.

Re: .Replace in einer Liste

Verfasst: Montag 8. Oktober 2018, 10:34
von comuniomeister
Vielen vielen Dank für eure Hilfe, ich habe es verstanden :)