Einträge in Unterlisten als Kriterium für while-Schleife

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
MortalWombat
User
Beiträge: 19
Registriert: Sonntag 1. Dezember 2019, 15:02

Hallo Leute,

ich möchte in einer while-Schleife als Kriterium auf die Einträge von Unterlisten in einer Liste zugreifen. Geht das?

Code: Alles auswählen

liste1 = [1,2,3,4]
liste2 = [5,6,7]

liste3 = [liste1,liste2]

variable = input()

while variable not in liste3:
   print("variable nicht gefunden")
   variable = input()

if variable in liste1:
   print("variable aus liste1")
else:
   print("variable aus liste2")
Vielen Dank für Eure Ideen
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich finde es schwer dein Kauderwelsch zu verstehen - "while-Schleife als Kriterium" ergibt fuer mich keinen Sinn.

Wenn du einen Weg suchst, in einer while-Schleife so lange etwas zu machen, bis das Kriterium "ding in liste3" erfuellt ist, dann macht man das so:

Code: Alles auswählen

while True:
    tuwas()
    if ding in liste3:
         break
liste1 - 3 sind uebrigens exquisit schlecht benamte Variablen.
MortalWombat
User
Beiträge: 19
Registriert: Sonntag 1. Dezember 2019, 15:02

Die Listennamen sind allgemein gehalten, damit Leute mit ähnlichen Problemen sich wiederfinden können.

Wenn Du ein anschaulicheres Beispiel brauchst, um mein Problem zu verstehen, schau mal hier:

Code: Alles auswählen

gemuese = [brokkoli,blumenkohl,karotte]
obst = [banane,apfel,erdbeere]

vegetarisch = [gemuese,obst]

variable = input("Geben Sie einen Essenswunsch ein:)

while variable not in vegetarisch:
   print("Ihre Speisen sind nicht enthalten!")
   variable = input()

if variable in gemuese:
   print("Sie mögen Gemüse?")
else:
   print("Sie mögen Obst?")
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@MortalWombat: Und die Lösung von __deets__ hast du nicht umgesetzt, weil?
MortalWombat
User
Beiträge: 19
Registriert: Sonntag 1. Dezember 2019, 15:02

Doch hab ich, hat mich auch ein Stück weiter gebracht :)

Es wundert mich nur, dass man die Kriterien in der while-Schleife nicht analog zu denen in der if-Anweisung anwenden kann. In der if-Anweisung kann ich ja auch schreiben

Code: Alles auswählen

if Bedingung == a or Bedingung==c:
  print("Passt!")
Das hätte ich irgendwie lieber gehabt, weil ich ja so meinen ganzen folgenden code in der Verschachtelung (while/if) habe. Das find ich irgendwie unübersichtlich.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Ich werde aus dem, was du schreibst, nicht klug.
Natürlich kann man Bedinungen genauso verwenden, wie bei einer if-Anweisung.
Aber die Bedingung wird beim Eintritt in die Schleife geprüft. Und es ist ein bisschen hässlich und fehleranfällig vor der Schleife die Werte zu sammeln und bei einem Fehlschlag die Werte _in_ der Schleife erneut zu sammeln. Deshalb macht man das an einer Stelle: In der Schleife.

Vielleicht solltest du dein Problem mal anhand von Code darlegen und beschreiben, was du machen möchtest. Ich sehe da nämlich keine if-Cascaden in einer Schleife.
MortalWombat
User
Beiträge: 19
Registriert: Sonntag 1. Dezember 2019, 15:02

Meine Ursprungsfrage war auch genereller Natur. Ich versuche gerade verschiedene Übungen zu bearbeiten und mich so in Python einzuarbeiten. Ich habe mich nur gewundert, dass es nicht möglich ist, den Inhalt von Unterlisten zu prüfen. Ich weiss mittlerweile zum Beispiel, dass ich mit liste[2][3] auf das 4. Element der 3. Unterliste in liste zugreifen kann. Was mich wundert ist, dass ich in meinem Beispiel ganz oben nicht prüfen kann, ob z.B. die Zahl 3 in liste3 enthalten ist.

Code: Alles auswählen

liste1 = [1,2,3,4]
liste2 = [5,6,7]

liste3 = [liste1,liste2]

variable = input()

while variable not in liste3:
   print("variable nicht gefunden")
   variable = input()
Wenn ich das Programm so eingebe, müsste er nach meinem Verständnis die while-Schleife verlassen, sobald man 3 eintippt. So, jetzt kommt aber die Realität, tritt mir die Tür ein und kackt auf meinen Teppich. Und ich weiss nicht warum.
bb1898
User
Beiträge: 200
Registriert: Mittwoch 12. Juli 2006, 14:28

MortalWombat hat geschrieben: Montag 1. Juni 2020, 18:47

Code: Alles auswählen

liste1 = [1,2,3,4]
liste2 = [5,6,7]

liste3 = [liste1,liste2]

variable = input()

while variable not in liste3:
   print("variable nicht gefunden")
   variable = input()

if variable in liste1:
   print("variable aus liste1")
else:
   print("variable aus liste2")
Da gibt es noch ein Problem, das in den bisherigen Antworten noch nicht berücksichtigt wurde: ich verstehe Dich so, dass Du als Antwort (in diesem Beispiel) eine der Zahlen zwischen 1 und 7 bekommen möchtest. Richtig? liste3 besteht aber nicht aus diesen Zahlen, sondern aus den beiden Unterlisten. "variable not in liste3" bleibt also wahr, so lange der Benutzer nicht "1,2,3,4" bzw. "5,6,7" eingibt. Da das wahrscheinlich eher nicht das ist, was Du willst, gehe ich auf die Umwandlungsprobleme jetzt nicht ein, die da noch zusätzlich entstehen.

Ausprobieren hilft, wie gewöhnlich:

Code: Alles auswählen

Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:37:02) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> liste1 = [1, 2, 3, 4]
>>> liste2 = [5, 6, 7]
>>> liste3a = [liste1, liste2]
>>> liste3a
[[1, 2, 3, 4], [5, 6, 7]]
>>> liste3b = liste1 + liste2
>>> liste3b
[1, 2, 3, 4, 5, 6, 7]
>>> 
Ich vermute mal, dass liste3b eher dem entspricht, was Du brauchst. liste1 und liste2 sind deshalb ja nicht weg, so dass die Abfrage hinterher weiter machbar ist.

So, und soeben sehe ich Deinen letzten Beitrag. Was ich hier schreibe, scheint zu Deinem aktuellen Problem zu passen.
MortalWombat
User
Beiträge: 19
Registriert: Sonntag 1. Dezember 2019, 15:02

bb1898 erstmal vielen Dank!! Endlich jemand, der das Problem versteht :D

Ja, also ich würde tatsächlich erwarten, dass die liste3 als "genestete" Liste genau das tut, nämlich zu schauen, was ist eigentlich in meinen Unterlisten. Dass das nicht gehen soll, empfinde ich als tiefen Einschnitt. Mir fallen so viele Beispiele ein, wo man schauen wollte, ob eine Bedingung durch eine Unterliste erfüllt ist.

Also, tatsächlich wollte ich genau das erreichen, dass jemand tatsächlich 3 eintippt und die Schleifenbedingung ist erfüllt und die Schleife endet. Mir ist bewusst, dass input dann ein integer sein sollte, also variable = int(input)). Allerdings wäre ja auch eine Anwendung mit Stings denkbar.

Beispiel:

Code: Alles auswählen

positiv = [ja, jupp, sicher, na klar, yes]
negativ = [nö, nein, nee, n]

antworten = [positiv,negativ]

print("Wollen sie das Menü sehen?)
eingabe = input(">")
eingabe = eingabe.lower()

while eingabe not in antworten:
    print("Bitte geben Sie Ihre Antwort noch mal ein:")
    eingabe = input(">")
    eingabe = eingabe.lower()

if eingabe in positiv:
   print(menu)

elseif eingabe in negativ:
   print("Schade, auf Wiedersehen!")
MortalWombat
User
Beiträge: 19
Registriert: Sonntag 1. Dezember 2019, 15:02

Also ja, mit

Code: Alles auswählen

while True:
würde es klappen, aber dann ist der Code so verschachtelt. Ist das nicht Mist? Gerade wenn ich immer unter 78 Zeichen bleiben soll, kann ich ja nicht endlos verschachteln. Oder sollte ich dann mit Funktionen arbeiten?
MortalWombat
User
Beiträge: 19
Registriert: Sonntag 1. Dezember 2019, 15:02

bb1898 hat geschrieben: Montag 1. Juni 2020, 20:04

Code: Alles auswählen

Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:37:02) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> liste1 = [1, 2, 3, 4]
>>> liste2 = [5, 6, 7]
>>> liste3a = [liste1, liste2]
>>> liste3a
[[1, 2, 3, 4], [5, 6, 7]]
>>> liste3b = liste1 + liste2
>>> liste3b
[1, 2, 3, 4, 5, 6, 7]
>>> 
Ich vermute mal, dass liste3b eher dem entspricht, was Du brauchst. liste1 und liste2 sind deshalb ja nicht weg, so dass die Abfrage hinterher weiter machbar ist.
Sehr geil, genau so was habe ich gesucht. Bleibt die Enttäuschung, dass Python nicht ohne weiteres die Mengen der Unterlisten durchsuchen kann.

VIELEN DANK :)
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MortalWombat: Das sind zwei völlig separate Probleme. Das man mit ``x in nested_lists`` nicht testen kann, hat nichts damit zu tun, dass das eine ``while True``-Schleife sein sollte. Der Grund dafür ist das man den Code mit der Eingabe nicht zweimal im Code stehen haben sollte. Das wäre auch immer noch der Fall wenn ``x in nested_list`` das machen würde was Du gerne hättest.

Automagisch einfach in verschachtelten Listen suchen hätte man vielleicht gerne, aber was machst Du dann wenn Du genau das nicht möchtest? Und wo wird eigentlich gesucht? Nur in Listen? Oder auch in Tupeln? Was ist mit Arrays? Wörterbücher auch? Und nur eine Ebene tief? Oder beliebig tief? Da gibt es ja viele verschiedene Varianten. Und ``x in something`` macht halt das einfachste und überschaubarste was auch bei allen Sequenztypen/iterierbaren Objekten gleich ist. Alles andere kann man sich daraus ja programmieren. Umgekehrt ginge das nicht.

Das Codebeispiel ist unnötig komplex IMHO, denn wenn man auf negative und positive antworten getestet hat, bleibt als dritter Fall übrig das keine der Möglichkeiten ausgewählt wurde. Das muss man nicht extra testen.

Code: Alles auswählen

    positiv = ["ja", "jupp", "sicher", "na klar", "yes"]
    negativ = ["nö", "nein", "nee", "n"]

    print("Wollen sie das Menü sehen?")
    while True:
        eingabe = input(">")
        eingabe = eingabe.lower()

        if eingabe in positiv:
            print(menu)
            break

        if eingabe in negativ:
            print("Schade, auf Wiedersehen!")
            break

        print("Bitte geben Sie Ihre Antwort noch mal ein:")
Aber man würde hier wahrscheinlich in der Tat auch schon mit einer Funktion arbeiten, die man dann ja auch wiederverwenden kann. Denn man möchte diese ganzen Zeilen ja nicht für jede ja/nein-Frage immer wieder schreiben.

Code: Alles auswählen

def bestaetigung_erfragen(frage):
    positiv = ["ja", "jupp", "sicher", "na klar", "yes"]
    negativ = ["nö", "nein", "nee", "n"]

    print(frage)
    while True:
        eingabe = input(">")
        eingabe = eingabe.lower()

        if eingabe in positiv:
            return True

        if eingabe in negativ:
            return False

        print("Bitte geben Sie Ihre Antwort noch mal ein:")


def main():
    menu = ...

    if bestaetigung_erfragen("Wollen sie das Menü sehen?"):
        print(menu)
    else:
        print("Schade, auf Wiedersehen!")
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
MortalWombat
User
Beiträge: 19
Registriert: Sonntag 1. Dezember 2019, 15:02

Cool, danke auch an Dich BlackJack.
Antworten