Seite 1 von 1
Einträge in Unterlisten als Kriterium für while-Schleife
Verfasst: Montag 1. Juni 2020, 18:47
von MortalWombat
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
Re: Einträge in Unterlisten als Kriterium für while-Schleife
Verfasst: Montag 1. Juni 2020, 18:54
von __deets__
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:
liste1 - 3 sind uebrigens exquisit schlecht benamte Variablen.
Re: Einträge in Unterlisten als Kriterium für while-Schleife
Verfasst: Montag 1. Juni 2020, 19:06
von MortalWombat
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?")
Re: Einträge in Unterlisten als Kriterium für while-Schleife
Verfasst: Montag 1. Juni 2020, 19:08
von sparrow
@MortalWombat: Und die Lösung von __deets__ hast du nicht umgesetzt, weil?
Re: Einträge in Unterlisten als Kriterium für while-Schleife
Verfasst: Montag 1. Juni 2020, 19:20
von MortalWombat
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
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.
Re: Einträge in Unterlisten als Kriterium für while-Schleife
Verfasst: Montag 1. Juni 2020, 19:31
von sparrow
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.
Re: Einträge in Unterlisten als Kriterium für while-Schleife
Verfasst: Montag 1. Juni 2020, 19:59
von MortalWombat
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.
Re: Einträge in Unterlisten als Kriterium für while-Schleife
Verfasst: Montag 1. Juni 2020, 20:04
von bb1898
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.
Re: Einträge in Unterlisten als Kriterium für while-Schleife
Verfasst: Montag 1. Juni 2020, 20:22
von MortalWombat
bb1898 erstmal vielen Dank!! Endlich jemand, der das Problem versteht
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!")
Re: Einträge in Unterlisten als Kriterium für while-Schleife
Verfasst: Montag 1. Juni 2020, 20:24
von MortalWombat
Also ja, mit
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?
Re: Einträge in Unterlisten als Kriterium für while-Schleife
Verfasst: Montag 1. Juni 2020, 20:30
von MortalWombat
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

Re: Einträge in Unterlisten als Kriterium für while-Schleife
Verfasst: Montag 1. Juni 2020, 20:49
von __blackjack__
@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!")
Re: Einträge in Unterlisten als Kriterium für while-Schleife
Verfasst: Mittwoch 3. Juni 2020, 22:06
von MortalWombat
Cool, danke auch an Dich BlackJack.