Wie bei Python mit "If" überprüfen ob Variable mit bestimmten Wert in Liste enthalten ist?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

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.

MelXn1234 
Fragesteller
 29.03.2023, 18:59

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)

0
MelXn1234 
Fragesteller
 29.03.2023, 20:34

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...

0
ralphdieter  30.03.2023, 02:35
@MelXn1234

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:

  1. 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.
  2. 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.
  3. 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.

1
MelXn1234 
Fragesteller
 30.03.2023, 06:25
@ralphdieter

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?

0
MelXn1234 
Fragesteller
 30.03.2023, 19:24
@ralphdieter

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.

0
ralphdieter  30.03.2023, 21:10
@MelXn1234
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.

0