Listen sortieren

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
mkaye
User
Beiträge: 4
Registriert: Sonntag 22. Januar 2023, 16:47

Liebe Leute haben ein ziemlich schweres Übungsbeispiel vom Prof bekommen, ich beiße mir jz seit Stunden daran die Zähne aus.
Hier die Aufgabenstellung:
Das Programm soll Eingaben (egal ob Zahlen oder Wörter) der Reihe nach einlesen und jeweils in einer Liste abspeichern (zB am Ende anhängen). Wird ein identischer Wert ein zweites Mal eingegeben, soll er wieder aus der Liste gelöscht werden (nach einem dritten Mal eingeben würde er wieder in der Liste stehen usw.). Die Eingabe eines einzelnen Punktes (".") beendet das Einlesen. Danach wird die Liste sortiert und jedes einzelne Element in einer separaten Zeile ausgegeben.

Das ist mein Ansatz:

Code: Alles auswählen

eingabe = True
liste = []
while eingabe != ".":
    eingabe = input("Bitte gib ein Wort oder eine Zahl ein ")
    liste.append(eingabe)
    liste.sort()
    dopellte_einträge = dict.fromkeys(liste)
    liste=list(dopellte_einträge)
    
liste.remove(".")
x=liste
for i in x:
    print(i)    
Wie schaffe ich es, dass der Wert doppelt in der liste vorkommt, wenn er ein drittes mal eingegeben wird und kann ich irgendwie die Sortierung optimieren? Hat sonst jemand Verbesserungsvorschläge ?
Liebe Grüße
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Du musst nach jeder Eingabe prüfen, ob diese schon in der Liste enthalten ist. Wenn nicht, dann anhängen, wenn ja, dann den Eintrag löschen.
Für das Löschen kann man sich zwei Varianten ausdenken. Eine einfache und eine etwas umständlichere.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn man die Aufgabe etwas freier nimmt und nur das Ergebnis zählt:

Code: Alles auswählen

from collections import Counter

words = Counter(iter(lambda:input("Bitte ein Wort eingeben ('.' zum Beenden): "), "."))
print(*sorted(word for word, count in words.items() if count & 1), sep="\n")
@mkaye: An Variablen sollte immer nur Werte eines Types gebunden werden, `eingabe` ist aber mal ein Boolean und mal ein String.
Wenn while-Schleifen nur starten, wenn man einer Variable einen Dummywert zuweist, hat man eigentlich eine while-True-Schleife.
Bei Deinem Code wird auch der "." in die Liste eingefügt.
Warum nennst Du Deine Liste `liste` in `x` um? Und warum nimmst Du i als for-Schleifen-Variable, obwohl doch in der Liste Wörter sind und kein Index.
Für das was Du da mit dem Wörterbuch anstellst, nimmt man ein Set, denn die Fähigkeiten eines Wörterbuches nutzt Du gar nicht.

Du mußt dem Wortlaut der Aufgabe genau folgen. Steht in der Aufgabe, Du sollst immer den Wert an die Liste anhängen, danach die Liste sortieren und dann alle mehrfachen Einträge entfernen, so dass jeder Wert nur noch einmal vorkommt?

Ich würde ja sagen, man muß sich entscheiden, ob man Wörter oder Zahlen in der Liste speichern will, denn Zahlen werden anders sortiert als Wörter.
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Zum letzten Satz: Kommt halt drauf an wie man das „sortiert“ versteht. Es steht ja kein Sortierkriterium in der Aufgabe, also könnte man argumentieren, dass das egal ist, solange es eindeutig und konsistent ist.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

mkaye hat geschrieben: Donnerstag 9. Februar 2023, 20:16 Wie schaffe ich es, dass der Wert doppelt in der liste vorkommt, wenn er ein drittes mal eingegeben wird
[...]
Das lese ich aus der Aufgabe nicht heraus.
mkaye
User
Beiträge: 4
Registriert: Sonntag 22. Januar 2023, 16:47

Sirius3 hat geschrieben: Donnerstag 9. Februar 2023, 23:24 Wenn man die Aufgabe etwas freier nimmt und nur das Ergebnis zählt:

Code: Alles auswählen

from collections import Counter

words = Counter(iter(lambda:input("Bitte ein Wort eingeben ('.' zum Beenden): "), "."))
print(*sorted(word for word, count in words.items() if count & 1), sep="\n")
@mkaye: An Variablen sollte immer nur Werte eines Types gebunden werden, `eingabe` ist aber mal ein Boolean und mal ein String.
Wenn while-Schleifen nur starten, wenn man einer Variable einen Dummywert zuweist, hat man eigentlich eine while-True-Schleife.
Bei Deinem Code wird auch der "." in die Liste eingefügt.
Warum nennst Du Deine Liste `liste` in `x` um? Und warum nimmst Du i als for-Schleifen-Variable, obwohl doch in der Liste Wörter sind und kein Index.
Für das was Du da mit dem Wörterbuch anstellst, nimmt man ein Set, denn die Fähigkeiten eines Wörterbuches nutzt Du gar nicht.

Du mußt dem Wortlaut der Aufgabe genau folgen. Steht in der Aufgabe, Du sollst immer den Wert an die Liste anhängen, danach die Liste sortieren und dann alle mehrfachen Einträge entfernen, so dass jeder Wert nur noch einmal vorkommt?

Ich würde ja sagen, man muß sich entscheiden, ob man Wörter oder Zahlen in der Liste speichern will, denn Zahlen werden anders sortiert als Wörter.
Vielen Dank für deine Antwort, müsste man Zahlen und Wörter getrennt sortieren, wenn ja wie? Ich hab ja auch das Problem bei dieser Art der Sortierung, dass die 11 vor der 4 sortiert wird?
imonbln
User
Beiträge: 191
Registriert: Freitag 3. Dezember 2021, 17:07

mkaye hat geschrieben: Freitag 10. Februar 2023, 07:41 Vielen Dank für deine Antwort, müsste man Zahlen und Wörter getrennt sortieren, wenn ja wie? Ich hab ja auch das Problem bei dieser Art der Sortierung, dass die 11 vor der 4 sortiert wird?
Das Trennen von Zahlen und Strings steht nicht in der Aufgabe, also solltest du es nicht machen und Input liefert immer einen String zurück, daher ist es streng genommen auch keine 11, sondern der String "11" und Strings werden nach Natural sort order sortiert bei der, der String "11" nun mal kleiner als der String "4" ist.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich lese bei der Anmerkung (egal ob Zahlen oder Wörter) heraus, dass Du Dich entscheiden kannst, entweder Wörter einzulesen und diese Lexikalisch sortierst, oder die eingegebenen Strings in Zahlen umwandelst, und diese nach Größe sortierst. Als pingeliger Informatiker kannst Du natürlich auch behaupten, wie sortiert werden soll ist nicht definiert und suchst Dir irgendeine Sortierreihenfolge aus, als fauler Programmierer sortierst Du einfach so, wie es Pythons sort-Methode automatisch mit Strings macht.
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mal eine mögliche Lösung:

Code: Alles auswählen

#!/usr/bin/env python3

END_MARKER = "."


def main():
    items = []
    while True:
        item = input(f"Eingabe ({END_MARKER} = Ende): ")
        if item == END_MARKER:
            break

        try:
            index = items.index(item)
        except ValueError:
            items.append(item)
        else:
            del items[index]

    items.sort()
    for item in items:
        print(item)


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten