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?
Konvertieren von Strings to float
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.
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.
- __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
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)
- __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.
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