Guten Tag zusammen,
ich bin noch ein totaler Neuling daher frage ich mal ins Blaue und hoffe jemand hat einen Denkanstoß für mich =)
Ich möchte im Vorfeld prüfen ob die Auswahl im Sortiment vorhanden ist.
So lange dies nicht der Fall ist, soll der Benutzer um eine andere Auswahl gebeten werden.
Der Code iteriert pro durchlauf "produkta" dann "produktb" usw..... dadurch ist immer nur die Eingabe gültig welche gerade zur Wert der Variablen "I" passt.
So wird aber leider nicht die komplette Liste geprüft, leider will mir nicht einfallen wie ich dieses Problem lösen könnte.
Ich hoffe auf eine Idee, danke und viele Grüße
sortiment = [["produkta",40],["produktb", 12], ["produktc", 8], ["produktd", 4]]
rabatt = [[10],[20]]
einkaufsliste = []
print("Was möchten Sie kaufen?", sortiment[0][0], sortiment[1][0], sortiment[2][0], sortiment[3][0])
einkauf = input()
for i in sortiment:
while i[0] != einkauf:
print(einkauf, i)
einkauf = input("gibt es nicht treffen Sie eine andere Auswahl")
else:
einkaufsliste.append([einkauf])
print("Ihre Einkaufsliste wurde um folgenden Artikel erweitert", einkaufsliste)
Iteration auf eine Liste
Wie schon von meinen Vorpostern beschreiben würde ich auch auf eine andere Datenstruktur setzen (Dictionary).
Wenn du willst, dass eine Eingabe solange gemach wird, bis diese Richtig ist, brauchst du eine Endlosschleife, die an entsprechender Stelle verlassen wird. Da du aber sicherlich mehr als einen Artikel auf deiner Einkausliste hast, macht es hier Sinn die Eingabe erst zu beenden, wenn der Nutzer beliebig viele Produkte ausgewählt hat. Ich habe mal geschreiben wie das ganze aussehen könnte. Bei Rückfragen kannst du dich gerne melden.
Wenn du willst, dass eine Eingabe solange gemach wird, bis diese Richtig ist, brauchst du eine Endlosschleife, die an entsprechender Stelle verlassen wird. Da du aber sicherlich mehr als einen Artikel auf deiner Einkausliste hast, macht es hier Sinn die Eingabe erst zu beenden, wenn der Nutzer beliebig viele Produkte ausgewählt hat. Ich habe mal geschreiben wie das ganze aussehen könnte. Bei Rückfragen kannst du dich gerne melden.
Code: Alles auswählen
#Zuordnung von Produktsoriment zu den Preisen als Dictionary
#Konstante, darum auf Modulebene
PRODUKTE_ZU_PREISEN = {"Produkt A": 40,
"Produkt B": 12,
"Product C": 8,
"Product D": 4}
#Hauptfunktion
def main():
#leere Liste wird erzeugt, an diese werden die ausgewählten Produkte angehangen
einkauf = []
#Endlosschleife startet
while True:
#Try und Except um bei Falscheingabe einen ValueError aufzurufen (raise) und diesen dann direkt abzufangen
try:
#Die Eingabe des Benutzers wird verlangt. Das ', '.join(PRODUKTE_ZU_PREISEN.keys() gibt alle Schlüssel des Dictionarys aus, getrennt mit einem Komma.
#Die geschweiften Klammern gehören mit dem f vor dem String zu sogenannten f-Strings und sind Teil der Stringformatierung
auswahl = input(f"Was möchten Sie kaufen? [{', '.join(PRODUKTE_ZU_PREISEN.keys())}] (Zum Abbrechen 'q' eingeben): ")
#Wenn ein 'q' eingegeben wird..
if auswahl == 'q':
#, wird die Endlosschleife per break verlassen
break
#Wenn die Eingabe kein 'q' ist und in den Schlüsseln des Dictionary ist (mit dem in Operator, was du wahrscheinlich gesucht hast)...
elif auswahl in PRODUKTE_ZU_PREISEN.keys():
#, wird die Auswahl der Einkaufsliste angehangen..
einkauf.append(auswahl)
#und der Benutzer bekommt eine Rückmeldung, dass die Auswahl in die Einkaufsliste hinzugefügt wurde.
print(f"Das Produkt [{auswahl}] wurde deiner Einkaufliste hinzugefügt!")
#Wenn die Eingabe nicht 'q' ist und auch nicht in PRODUKTE_ZU_PREISEN.keys() (liefert die Liste ['Produkt A', 'Produkt B', 'Product C', 'Product D'])
else:
#Wird ein ValueError aufgerufen
raise ValueError
#Hier wird der ValueError abgefangen
except ValueError:
#Und es wird der Grund ausgegeben
print("Fehler bei der Eingabe, erneut versuchen")
#Dann wird nochmal die gesamte Einkaufsliste ausgegeben, damit der Benutzer weiß, was er schon alles eingegeben hat
print(f"Aktuelle Einkausliste: {', '.join(einkauf)}")
#Dann geht es hier wieder zum Anfang der Endlosschleife
#Wurde die Endlosschleife per break verlassen geht es hier weiter, dort wird geprüft, ob überhaupt ein Produkt in der Einkaufsliste hinzugefügt wurde
if len(einkauf) > 0:
#Wenn ein oder mehr als ein Produkt auf der Einkaufssliste sind wird abschließend die Einkaufsliste nochmal ausgegeben.
print(f"Auswahl abgeschlossen, in der Einkaufliste befinden sich: {', '.join(einkauf)}")
else:
#oder auch nicht, wenn die Einkaufsliste leer ist
print("Auswahl abgeschlossen, die Einkaufliste bleibt leer.")
#Aufruf der Hauptfunktion
if __name__ == '__main__':
main()
@Jankie: an welcher Stelle kann denn ein ValueError auftreten? Nur dort, wo Du ihn explizit auslöst. Es gilt, immer möglichst wenig innerhalb des try-Blocks zu haben, um möglichst exakt darauf reagieren zu können. Bei Dir würde der try-Block also nur das raise umschließen.
Code: Alles auswählen
PRODUKTE_ZU_PREISEN = {
"Produkt A": 40,
"Produkt B": 12,
"Product C": 8,
"Product D": 4,
}
def main():
einkauf = []
while True:
auswahl = input(f"Was möchten Sie kaufen? [{', '.join(PRODUKTE_ZU_PREISEN)}] (Zum Abbrechen 'q' eingeben): ")
if auswahl == 'q':
break
elif auswahl in PRODUKTE_ZU_PREISEN:
einkauf.append(auswahl)
print(f"Das Produkt [{auswahl}] wurde deiner Einkaufliste hinzugefügt!")
else:
print("Fehler bei der Eingabe, erneut versuchen")
print(f"Aktuelle Einkausliste: {', '.join(einkauf)}")
if len(einkauf) > 0:
print(f"Auswahl abgeschlossen, in der Einkaufliste befinden sich: {', '.join(einkauf)}")
else:
print("Auswahl abgeschlossen, die Einkaufliste bleibt leer.")
if __name__ == '__main__':
main()
@Jankie
keys() kann man übrigens beim Iterieren weglassen, denn beim Wörterbuch werden da automatisch die Schlüssel angenommen. Insofern kannst du auch schreiben:
keys() kann man übrigens beim Iterieren weglassen, denn beim Wörterbuch werden da automatisch die Schlüssel angenommen. Insofern kannst du auch schreiben:
Code: Alles auswählen
", ".join(PRODUKTE_ZU_PREISEN)
...
elif auswahl in PRODUKTE_ZU_PREISEN:
...
Danke für die Anmerkungen und Verbesserungen. Das mit dem try und except hab ich mir wahrscheinlich angeeignet, weil ich öfters mal Zahleneingaben habe und dort direkt den input in einen Integer umwandel, da dort ein ValueError auftreten kann. Hab dann für dieses Beispiel hier den Block einfach kopiert ohne weiter drüber nach zu denken.
Hier dann nochmal mit den Änderungen und Erklärung als Kommentare:
Frage an die anderen:
Würdet ihr das eher so:
oder so schreiben:
Hier dann nochmal mit den Änderungen und Erklärung als Kommentare:
Code: Alles auswählen
#Zuordnung von Produktsoriment zu den Preisen als Dictionary
#Konstante, darum auf Modulebene
PRODUKTE_ZU_PREISEN = {"Produkt A": 40,
"Produkt B": 12,
"Product C": 8,
"Product D": 4}
#Hauptfunktion
def main():
#leere Liste wird erzeugt, an diese werden die ausgewählten Produkte angehangen
einkauf = []
#Endlosschleife startet
while True:
#Die Eingabe des Benutzers wird verlangt. Das ', '.join(PRODUKTE_ZU_PREISEN gibt alle Schlüssel des Dictionarys aus, getrennt mit einem Komma.
#Die geschweiften Klammern gehören mit dem f vor dem String zu sogenannten f-Strings und sind Teil der Stringformatierung
auswahl = input(f"Was möchten Sie kaufen? [{', '.join(PRODUKTE_ZU_PREISEN)}] (Zum Abbrechen 'q' eingeben): ")
#Wenn ein 'q' eingegeben wird..
if auswahl == 'q':
#, wird die Endlosschleife per break verlassen
break
#Wenn die Eingabe kein 'q' ist und in den Schlüsseln des Dictionary ist...
elif auswahl in PRODUKTE_ZU_PREISEN.keys():
#, wird die Auswahl der Einkaufsliste angehangen..
einkauf.append(auswahl)
#und der Benutzer bekommt eine Rückmeldung, dass die Auswahl in die Einkaufsliste hinzugefügt wurde.
print(f"Das Produkt [{auswahl}] wurde deiner Einkaufliste hinzugefügt!")
#Wenn die Eingabe nicht 'q' ist und auch nicht in PRODUKTE_ZU_PREISEN.keys() ist (liefert die Liste ['Produkt A', 'Produkt B', 'Product C', 'Product D'])
else:
#Wird eine Meldung ausgegeben
print(f"Fehler bei der Eingabe von [{auswahl}], erneut versuchen")
#Dann wird nochmal die gesamte Einkaufsliste ausgegeben, damit der Benutzer weiß, was er schon alles eingegeben hat
print(f"Aktuelle Einkausliste: {', '.join(einkauf)}")
#Dann geht es hier wieder zum Anfang der Endlosschleife
#Wurde die Endlosschleife per break verlassen geht es hier weiter, dort wird geprüft, ob überhaupt ein Produkt in der Einkaufsliste hinzugefügt wurde
if len(einkauf) > 0:
#Wenn ein oder mehr als ein Produkt auf der Einkaufssliste sind wird abschließend die Einkaufsliste nochmal ausgegeben.
print(f"Auswahl abgeschlossen, in der Einkaufliste befinden sich: {', '.join(einkauf)}")
else:
#oder auch nicht, wenn die Einkaufsliste leer ist
print("Auswahl abgeschlossen, die Einkaufliste bleibt leer.")
#Aufruf der Hauptfunktion
if __name__ == '__main__':
main()
Würdet ihr das eher so:
Code: Alles auswählen
if len(einkauf) > 0:
print(f"Auswahl abgeschlossen, in der Einkaufliste befinden sich: {', '.join(einkauf)}")
else:
print("Auswahl abgeschlossen, die Einkaufliste bleibt leer.")
Code: Alles auswählen
print(f"Auswahl abgeschlossen, in der Einkaufliste befinden sich: {', '.join(einkauf)}" if len(einkauf) > 0 else "Auswahl abgeschlossen, die Einkaufliste bleibt leer.")