Wie bei Python mit "If" überprüfen ob Variable mit bestimmten Wert in Liste enthalten ist?
Ich muss für die Schule ein Spiel in Python programmieren. Problem dabei: Uns wurde noch nicht wirklich viel beigebracht und daher verstehe ich nicht, wie ich gewisse Sachen programmieren soll.
Folgendes Szenario bereitet mir nun Schwierigkeiten:
Das Programmierte ist kein Ausschnitt aus meinem Spiel, sondern einfach das gleiche Schema, wie die eine Stelle in meinem Spiel (sonst wäre es zu kompliziert zum verstehen). x hat z.B nicht immer den Wert 5, dieser ändert sich im Verlaufe des Programms.
Ich möchte überprüfen, ob eine der Variable in der Liste einen Wert zwischen 0 und 10 hat. Ist es möglich, dies mit einem "if" Befehl zu lösen? Was müsste bei "Bedingung_erfüllendes_Element" stattdessen stehen? Ich kann da ja nicht ">=0 and <=10" hinschreiben. Das einzige, was ich überprüfen kann, ist ob eine bestimmte Variable in der Liste ist. (z.B if x in liste), aber das möchte ich ja nicht, ich möchte auf den WERT der vorhandenen Variablen überprüfen.
Ich habe es auch schon mit einer For-Schleife probiert, aber da ist da Problem, dass wenn zwei Elemente, welche die Bedingung erfüllen, vorkommen, dass die folgenden Befehle doppelt ausgeführt werden. Es soll aber, für jedes Element, welches die Bedingung erfüllt, ein anderer Text geprintet werden.
Ich brauche wirklich nur diesen einen, eigentlich simplen Befehl, der überprüft, ob es in der Liste mindestens ein Element hat, welches einen bestimmten Wert hat.
1 Antwort
Meinst Du
if any(0<=e<=10 for e in liste):
print("Die Liste enthält mindestens ein Element zwischen 0 und 10.")
Der Sinn der folgenden Abfragen erschließt sich mir allerdings nicht.
Dir scheint das Objekt-Konzept von Python noch nicht ganz klar zu sein:
In Deinem Codebeispiel enthält liste die Werte von x, y und z zu dem Zeitpunkt, an dem die Zeile 5 ausgeführt wird. Spätere Änderungen von x, y oder z haben keinen Einfluss mehr auf liste. Solche (manchmal unerwünschten) Effekte gibt es nur bei komplexeren Objekten wie list, set, date und eigenen Klassen (weil die modifizierbar sind):
x = 1
y = 2
liste = [ x, y ]
liste2 = [ x, y ]
liste3 = liste
liste4 = [ liste, liste2, liste3 ]
x = 3 # keine Änderung in den Listen
liste[0] = 3 # jetzt ist auch liste3==[3, 2] und
# liste4==[[3, 2], [1, 2], [3, 2]]
Effektiv machst Du mit x, y, z und liste doppelte Buchführung. Ohne die Absicht dahinter zu kennen kann ich nur pauschal drei Möglichkeiten nennen, wie man das beheben kann:
- Lass liste weg und schreibe stattdessen überall [x, y, z] (oder (x, y, z) oder frozenset(x, y, z) oder ...). Dann hast Du garantiert immer die aktuellen Werte.
- Lass x, y und z weg und ändere stattdessen immer liste[0], liste[1] und liste[2]. Dann bleibt liste immer auf dem neuesten Stand.
- Schreibe eine Klasse, die die aktuellen Werte von x, y und z repräsentiert. Ob die Klasse nur einen oder alle drei Werte verwaltet, hängt von ihrem Verwendungszweck ab. Beispiel:
def class Spielstand:
def __init__(self):
self.x = self.y = self.z = 100
def __str__(self):
return "Stand: {x} / {y} / {z}".format(self)
def punktabzug(self, dx, dy, dz):
self.x -= dx
self.y -= dy
self.z -= dz
def kritisch(self):
return any(0<=e<=10 for e in (self.x, self.y, self.z))
def spielende(self):
return self.x<0 or self.y<0 or self.z<0
Eine Spielstand-Instanz ersetzt dann x, y, z und liste einschließlich aller Methoden, die Du darauf loslassen willst. Auf den ersten Blick sieht das nach unnötiger Mehrarbeit aus. Aber wenn Dein Code wächst, ist das mit Abstand die beste Methode, den Überblick zu behalten.
Wenn ich aber mit for element in liste auf die Liste zugreife, werden die aktuellen Werte genommen... Warum geht es bei for aber bei if nicht?
Aber wie auch immer, ich habs jetzt mit der zweiten Möglichkeit versucht, die du gezeigt hast und es klappt alles einwandfrei :). Vielen Dank! Ich habe aber bemerkt, das es noch einiges für mich zum lernen gibt😅. Routine fehlt auch vollkommen, aber ey, ich hab nicht vor Informatik zu studieren.
Warum geht es bei for aber bei if nicht?
Das sollte eigentlich in beiden Fällen gleich (nämlich nicht) funktionieren. Falls Du einen Unterschied bemerkst, muss das an etwas anderem liegen.
Sieht ganz danach, als ob das das ist, wonach ich gesucht habe! Dieses "any" haben wir noch gar nicht durchgenommen, also irgendwie klar, dass ich nicht auf die Lösung gekommen bin.
So wie's im Screenshot steht, ergibt es tatsächlich noch nicht so Sinn, aber im Zusammenhang des Spiels, wo alles anders benannt ist und drumrum noch mehr existiert, ergibt es Sinn, zumindest für mich. (Ich glaube ich könnte manches kompakter machen, aber ich bin froh, solange es überhaupt funktioniert)
Ein Problem hat sich aber leider noch ergeben. An sich funktioniert dieses Programm isoliert wie es soll, wenn ich es aber ins gesamte Spiel einbaue, ergibt sich da ein Problem.
Am Anfang werden die Variablen x, y, z (bei mir im Spiel andere Namen, hier so genannt weil einfacher zu verstehen) je auf 100 gesetzt. Während des Spielens ändern sich die Werte durch Aktionen, die man durchführt. So kann nach einer Zeit z.B x = 10, y = -20 und z = 120 sein. Wenn ich jetzt die Funktion mit diesem any durchführe, wird nicht x = 10, y =- 20 ect. überprüft, sondern x = 100 ect, also so, wie der Wert ganz am Anfang festgelegt wurde. Ich kann mir überhaupt nicht erklären, warum sich das Programm auf den zu Anfang festgelegten Wert der Variable bezieht und nicht auf den neuen Wert, der während dem Spiel entsteht.
Ich hoffe man versteht, was ich meine, aber anders kann ichs kaum erklären, sonst müsste ich mein ganzes Spiel erklären...