Seite 1 von 1
Listen sortieren
Verfasst: Donnerstag 9. Februar 2023, 20:16
von mkaye
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
Re: Listen sortieren
Verfasst: Donnerstag 9. Februar 2023, 20:26
von ThomasL
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.
Re: Listen sortieren
Verfasst: Donnerstag 9. Februar 2023, 23:24
von Sirius3
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.
Re: Listen sortieren
Verfasst: Donnerstag 9. Februar 2023, 23:43
von __blackjack__
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.
Re: Listen sortieren
Verfasst: Freitag 10. Februar 2023, 05:53
von sparrow
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.
Re: Listen sortieren
Verfasst: Freitag 10. Februar 2023, 07:41
von mkaye
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?
Re: Listen sortieren
Verfasst: Freitag 10. Februar 2023, 08:19
von imonbln
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.
Re: Listen sortieren
Verfasst: Freitag 10. Februar 2023, 08:31
von Sirius3
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.
Re: Listen sortieren
Verfasst: Dienstag 28. Februar 2023, 12:18
von __blackjack__
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()