Sort() funktioniert mit Ausnahme des ersten Elements

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
ihavenoclue
User
Beiträge: 10
Registriert: Montag 18. Oktober 2021, 14:43

Hi!

Ich bin neu hier im Forum und generell in der Welt des Programmierens :)
Ich versuche gerade eine Liste zu erstellen. Und zwar soll man verschiedene Wörter über die Konsole eingeben. Diese sollen dann anhand eines Kommas gesplittet werden, sodass aus einem String eine Liste entsteht. Output soll dann diese Liste sein, aber sortiert in alphabetischer Reihenfolge.

Das habe ich bisher als Code:

Code: Alles auswählen

words = input('Bitte geben Sie fünf Wörter ein (Komma nicht vergessen): ')
wordlist = words.split(',')
wordlist.sort(key=str.lower)
print(wordlist)
Dieser funktioniert auch soweit. Allerdings wird das erste Element meiner Liste im Output nicht in den Sorting Process einbezogen, sondern nach ganz hinten gestellt:

Code: Alles auswählen

Bitte geben Sie fünf Wörter ein (Komma nicht vergessen): Ananas, blau, schön, Ordner, Fenster, Zepter, magisch, PQ, Dose
	----> 	[' blau', ' Dose', ' Fenster', ' magisch', ' Ordner', ' PQ', ' schön', ' Zepter', 'Ananas']
Das Element 'Ananas' rückt also an die letzte Stelle, obwohl die restlichen Elemente alphabetisch sortiert wurden. Egal, welche Begriffe ich eingebe, das erste Element rückt immer an die letzte Stelle.

Im Internet finde ich dazu leider nichts. Es wäre super, wenn mir jemand erklären könnte, was ich hier falsch mache.

Vielen Dank! :-)

Liebe Grüße,
Sediah
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das liegt daran, dass du vor allen Worten ausser dem ersten ein Leerzeichen hast. Und das ist mit seinem ASCII-Code 32 kleiner als selbst das A (ASCII-Code 65).

Du musst also erstmal deine Wortliste bereinigen, und allen Worten den umliegenden Leerraum entziehen. Das geht mit der Methode strip(), zu finden auch in der Dokumentation.

Danach wirst du uebrigens ein aehnliches Problem mit Gross/Kleinschreibung bekommen, "Banane" befindet sich vor "ananas", wenn es denn so eingegeben wird. Und das kannst du dadurch aendern, indem du erstmal mittels lower zB (oder upper) normalisierst.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@__deets__: Das wird doch schon mit dem `key`-Argument gemacht‽ Das Problem was ich da noch sehe, ist das dann kein Unterschied mehr zwischen "Banane" und "banane" mehr gemacht wird, und nicht garantiert ist, in welcher Reihenfolge die sortiert werden. Sollte man das auch berücksichtigen wollen, müsste die `key`-Funktion ein kleines bisschen mehr machen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

__blackjack__ hat geschrieben: Montag 18. Oktober 2021, 15:17 @__deets__: Das wird doch schon mit dem `key`-Argument gemacht‽ Das Problem was ich da noch sehe, ist das dann kein Unterschied mehr zwischen "Banane" und "banane" mehr gemacht wird, und nicht garantiert ist, in welcher Reihenfolge die sortiert werden. Sollte man das auch berücksichtigen wollen, müsste die `key`-Funktion ein kleines bisschen mehr machen.
Du hast natuerlich recht, habe ich irgendwie uebersehen.
ihavenoclue
User
Beiträge: 10
Registriert: Montag 18. Oktober 2021, 14:43

Vielen lieben Dank für Eure Antworten!! :) @__deets__ @__blackjack__

Die Sort-Funktion ist jedoch leider nur an Strings anwendbar. Wenn ich die Sort-Funktion vor den Splitting Process setze, funktioniert es leider immer noch nicht.

@__blackjack__ Ob, als erstes Banane oder banane ausgespuckt wird, ist erstmal irrelevant.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du sollst das auch nicht vor den splitting-Prozess setzen. Das sort funktioniert schon so. Du musst eben deine Liste an Worten nochmal ueberarbeiten. Also nach dem split, aber vor dem sort.
ihavenoclue
User
Beiträge: 10
Registriert: Montag 18. Oktober 2021, 14:43

Das Problem ist hier eben, dass ich eine Liste ausgegeben bekommen möchte. Und die Strip() Funktion wohl nur für Strings anwendbar ist. Sorry, stehe gerade total auf dem Schlauch.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst strip auf jedes einzelene deiner Worte anwenden, die in der Liste sind, und eine neue Liste mit gestrippten Worten aufbauen. Und diese neue Liste dann sortieren und ausgeben.
ihavenoclue
User
Beiträge: 10
Registriert: Montag 18. Oktober 2021, 14:43

Habe nun eine Lösung gefunden!! Und zwar mittels der Replace-Funktion! :-)
Vielen Dank für eure Hilfe!

Wenn du Lust (und Zeit hast) @__deets__, kannst du mir gerne erklären, wie ich bei der Strip-Methode vorgehen muss. Kenne mich da nämlich überhaupt nicht aus und hätte momentan auch keine Idee, wie ich die strip-Funktion auf einen input-String anwenden soll :D Wie gesagt: bin ganz neu hier :)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du sollst das ja auch immer noch nicht auf den Input String anwenden. Das bringt nichts, denn da sind die Leerzeichen ja irgendwo drin. Sondern auf die einzelnen Worte in deiner Liste. Und weil strings unveränderlich sind, muss man eben die neuen Worte ohne Leerzeichen speichern. Und dann sortieren.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ihavenoclue: `strip()` wendet man genau so an wie `replace()`. Wobei ich gerade die Befürchtung habe, dass Du `replace()` *vor* dem `split()` anwendest, was eine andere Wirkung hat als `strip()` danach auf jeden einzelnen Teil anzuwenden. Denn `replace()` ersetzt dann ja einfach *alle* Leerzeichen, nicht nur die am Anfang und Ende der Einzelteile, sondern auch *innerhalb* der Einzelteile.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Code: Alles auswählen

words = input('Bitte geben Sie fünf Wörter ein (Komma nicht vergessen): ')
wordlist = [w.strip() for w in words.split(',')] # hier werden die Leerzeichen links und rechts vom str entfernt
wordlist.sort(key=str.lower)
print(wordlist)
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Oder alternativ str.strip mittels map auf jeden String anwenden.

Code: Alles auswählen

words = input('Bitte geben Sie fünf Wörter ein (Komma nicht vergessen): ')
wordlist = sorted(map(str.strip, words.split(',')), key=str.lower)
print(wordlist)
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Weil es so schön ist, hier noch eine Variante:

Code: Alles auswählen

words = input('Bitte geben Sie fünf Wörter ein (Komma nicht vergessen): ')
wordlist = sorted(words.split(','), key=lambda x: x.strip().lower())
print(wordlist)
Dabei bleiben die Leerzeichen erhalten, werden beim Sortieren aber nicht berücksichtigt.
Antworten