Iteration auf eine Liste

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
Zer0zer
User
Beiträge: 1
Registriert: Samstag 17. Oktober 2020, 16:25

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)
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du die komplette Liste prüfen willst, dann mußt Du das auch so programmieren.
Da sind die verschachtelten Schleifen etwas durcheinander gekommen.
Benutzeravatar
snafu
User
Beiträge: 6870
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das schreit nach einem Wörterbuch (dict). Die Produktbezeichnung als Schlüssel und die Preise als Werte. Mit keys() lassen sich dann auch alle Schlüssel (Produktnamen) anzeigen.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

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.

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()
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

@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()
Benutzeravatar
snafu
User
Beiträge: 6870
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Jankie
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:
    ...
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

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:

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()
Frage an die anderen:

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.")
oder so schreiben:

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.")
Antworten