Konvertieren von Strings to float

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
Bojman
User
Beiträge: 2
Registriert: Montag 25. November 2019, 22:06

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?
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Bojman
User
Beiträge: 2
Registriert: Montag 25. November 2019, 22:06

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.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

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.
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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 ].
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

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)
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten