Seite 1 von 1

Sort() funktioniert mit Ausnahme des ersten Elements

Verfasst: Montag 18. Oktober 2021, 15:06
von ihavenoclue
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

Re: Sort() funktioniert mit Ausnahme des ersten Elements

Verfasst: Montag 18. Oktober 2021, 15:09
von __deets__
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.

Re: Sort() funktioniert mit Ausnahme des ersten Elements

Verfasst: Montag 18. Oktober 2021, 15:17
von __blackjack__
@__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.

Re: Sort() funktioniert mit Ausnahme des ersten Elements

Verfasst: Montag 18. Oktober 2021, 15:40
von __deets__
__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.

Re: Sort() funktioniert mit Ausnahme des ersten Elements

Verfasst: Montag 18. Oktober 2021, 15:43
von ihavenoclue
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.

Re: Sort() funktioniert mit Ausnahme des ersten Elements

Verfasst: Montag 18. Oktober 2021, 15:48
von __deets__
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.

Re: Sort() funktioniert mit Ausnahme des ersten Elements

Verfasst: Montag 18. Oktober 2021, 15:52
von ihavenoclue
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.

Re: Sort() funktioniert mit Ausnahme des ersten Elements

Verfasst: Montag 18. Oktober 2021, 15:53
von __deets__
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.

Re: Sort() funktioniert mit Ausnahme des ersten Elements

Verfasst: Montag 18. Oktober 2021, 16:12
von ihavenoclue
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 :)

Re: Sort() funktioniert mit Ausnahme des ersten Elements

Verfasst: Montag 18. Oktober 2021, 16:17
von __deets__
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.

Re: Sort() funktioniert mit Ausnahme des ersten Elements

Verfasst: Montag 18. Oktober 2021, 16:17
von __blackjack__
@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.

Re: Sort() funktioniert mit Ausnahme des ersten Elements

Verfasst: Dienstag 19. Oktober 2021, 10:19
von DeaD_EyE

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)

Re: Sort() funktioniert mit Ausnahme des ersten Elements

Verfasst: Dienstag 19. Oktober 2021, 13:09
von /me
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)

Re: Sort() funktioniert mit Ausnahme des ersten Elements

Verfasst: Dienstag 19. Oktober 2021, 15:10
von kbr
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.