Seite 1 von 1

Konvertieren von Strings to float

Verfasst: Montag 25. November 2019, 22:30
von Bojman
Guten Abend,

bin neu hier im Forum und blutiger Python Anfänger. Folgendes Problem stellt sich mir bei folgender Aufgabe:


"Schreiben Sie ein Programm, das Zahlen in der Datei numbers.txt einliest und sie nach numerisch absteigender Reihenfolge sortiert. Danach sollen sie letzten 50 Zahlen (d.h. die 50 kleinsten) entfernt werden. Anschließend soll das Programm die Zahlen zeilenweise ausgeben.
Hinweis: um einen String in eine Kommazahl umzuwandeln, verwenden Sie die Funtion float. Zum Beispiel ist float("4.2") == 4.2."

Ich konnte die Datei hier nicht hochladen, aber so sieht ein Teil von ihr aus:

numbers.txt
2.89
37.6
28.86
5.89
13.68
11.94
21.09
31.09
1.97
0.58
36.13
11.34
28.73
0.04
11.79
25.57
5.2
58.11
46.34





f = open("numbers.txt", encoding="utf-8")
words = f.read()
f.close()
for numbers in words.split():
float(words)
print(words)

Bei o.g. Befehl kommt der Error: "could not convert string to float:"

Die Frage lautet also, wie konvertiert man strings in floats?

Re: Konvertieren von Strings to float

Verfasst: Montag 25. November 2019, 22:46
von __deets__
Wenn du schon einzelne Worte aus der Datei per split holst, dann musst du auch die wandeln. Und nicht versuchen den Inhalt der gesamten Datei zu EINEM float zu machen. Und es lohnt sich mal auf die Variablennamen zu achten, ein Element aus den aufgeteilten words ist ein word. Nicht numbers. Das wäre dann die Liste der Gewandelten Worte.

Re: Konvertieren von Strings to float

Verfasst: Montag 25. November 2019, 23:09
von Bojman
Wie genau meinst du das? Also wie würdest du das Programm dann schreiben? Bei über 900 strings kann man das ja schlecht für jeden einzeln umwandeln.

Re: Konvertieren von Strings to float

Verfasst: Montag 25. November 2019, 23:20
von sparrow
Klar, warum denn nicht?

Wie __deets__ schrieb: benutze sprechende Variablem. Du versuchst gerate Wörter (Mehrzahl!) in eine (1!) Fließkommazahl zu konvertieren. Das geht nicht.

Also musst du das in der Schleife machen.

Re: Konvertieren von Strings to float

Verfasst: Montag 25. November 2019, 23:53
von __deets__
Schau mal GENAU auf deinen Code. Du hast eine Variable numbers, welche die einzelnen Worte aus dem Text annimmt. Die benutzt du aber weiter gar nicht. Stattdessen versuchst du mit einem Mal de gesamten Dateiinhalt in nur ein float zu wandeln. Tjoa. Nicht so sinnvoll, oder? Nimm die richtig Variable, und du bist einen Schritt weiter. Und benenn sie auch noch korrekt wie schon angemerkt.

Re: Konvertieren von Strings to float

Verfasst: Mittwoch 27. November 2019, 07:44
von __blackjack__
In Smalltalk (Pharo) könnte eine Lösung so aussehen:

Code: Alles auswählen

| numbers |
numbers := OrderedCollection new.
'numbers.txt' asFileReference
    readStreamDo: [ :s |
        [ s atEnd ] whileFalse: [ numbers add: s nextLine asNumber ]
    ].
((numbers sort; reverse) allButLast: 50)
    do: [ :n | Transcript show: n; cr ].

Re: Konvertieren von Strings to float

Verfasst: Donnerstag 28. November 2019, 08:03
von Jankie
zur Vervollständigung:

Code: Alles auswählen

with open("numbers.txt", "r", encoding="UTF-8") as number_file:
    numbers_in_float = sorted([float(line) for line in number_file], reverse = True)[:-50]


for number in numbers_in_float:
    print(number)

Re: Konvertieren von Strings to float

Verfasst: Donnerstag 28. November 2019, 08:17
von __blackjack__
@Jankie: Das sollte eher `numbers_as_float` heissen, wobei ich den Zusatz einfach weglassen würde, also nur `numbers` schreiben würde.

Bei `number_file` fehlt ein `s`, denn da ist ja mehr als eine Zahl drin. Auch hier könnte man den Zusatz weg lassen. Ich nenne Dateiobjekte die nur zum iterieren über Zeilen verwendet werden oft einfach `lines`.

Statt „list comprehension“ tut es hier auch ein Generatorausdruck damit die Liste mit den Zahlen nicht zweimal im Speicher existieren muss. Allerdings würde sich hier auch einfach `map()` anbieten.