Python, как if - in в списках работает?

Есть код:

datap1 = ["a3","a2","b2"]

if "a1" in datap1:
    print("1")
if "a2" in datap1:
        print("2")
if "a3" in datap1:
        print("3")
if "b1" in datap1:
        print("4")
if "b2" in datap1:
        print("5")
if "b3" in datap1:
        print("6")
if "c1" in datap1:
        print("7")
if "c2" in datap1:
        print("8")
if "c3" in datap1:
        print("9")



if ("a1" and "b1" and "c1") or ("a2" and "b2" and "c2") or ("a3" and "b3" and "c3") or ("a1" and "a2" and "a3") or ("b1" and "b2" and "b3") or ("c1" and "c2" and "c3") or ("a1" and "b2" and "c3") or ("c1" and "b2" and "a3") in list(datap1):
        print('Игрок выиграл!')
        exit()
else:
    print("game over")

И по логике должно выводиться в конце game over, а выводится Игрок выиграл!

Можете, пожалуйста, помочь с кодом(чтобы он при только условии выводил Игрок выиграл!)

И пожалуйста объясните, как реализовывать условия с and и or в списках.

Заранее ,спасибо!

Ps. Гуглил, ответа не нашёл


Ответы (3 шт):

Автор решения: Denis640Kb

Можно так(Не претендую на самый удобный вариант))):

datap1 = ["a1","a2","a3"]
c = 'Игрок выиграл'
z = 0
check = [["a1","a2","a3"],["b1","b2","b3"],["c1","c2","c3"],["a1","b1","c1"],['a2','b2','c2'],['a3','b3','c3'],['a1','b2','c3'],['c1','b2','a3']]

def CHecks(check, data1):
    for z in check:
        if (z == data1):
            a = 'Игрок выиграл'
            return a
    a = "Game over"
    return a

print(CHecks(check, datap1))
→ Ссылка
Автор решения: Xander

Вашу задачу проще всего решить как-то так:

datap1 = ["a3","a2","b2"]

# Здесь перечислены все выигрышные варианты
win_variants = [
    ("a1", "b1", "c1"),
    ("a2", "b2", "c2"),
    ("a3", "b3", "c3"),
    ("a1", "a2", "a3"),
    ("b1", "b2", "b3"),
    ("c1", "c2", "c3"),
    ("a1", "b2", "c3"),
    ("c1", "b2", "a3"),
]


check = any(len(set(datap1) & set(variant)) == 3
            for variant in win_variants)

if check:
    print('Игрок выиграл!')
else:
    print("game over")

А что касается операторов and и or, то нужно просто понять, что они работают не так, как и/или в обычной речи. Есть чёткие правила, как они работают, которые нужно просто прочитать и запомнить. А не пытаться дословно переводить фразу с русского на питон.

→ Ссылка
Автор решения: JTProg

Правильная проверка должна выглядеть вот так для вашего кода:

if (("a1" in datap1) and ("b1" in datap1) and ("c1" in datap1)) or (
        ("a2" in datap1) and ("b2" in datap1) and ("c2" in datap1)) or (
        ("a3" in datap1) and ("b3" in datap1) and ("c3" in datap1)) or (
        ("a1" in datap1) and ("a2" in datap1) and ("a3" in datap1)) or (
        ("b1" in datap1) and ("b2" in datap1) and ("b3" in datap1)) or (
        ("c1" in datap1) and ("c2" in datap1) and ("c3" in datap1)) or (
        ("a1" in datap1) and ("b2" in datap1) and ("c3" in datap1)) or (
        ("c1" in datap1) and ("b2" in datap1) and ("a3" in datap1)):
    print('Игрок выиграл!')
    # exit()
else:
    print("game over")

Пусть монструозно, но в данном варианте проверяется каждое из вхождений с условиями. Что же касается and/or - тут изначально в вашем варианте выполняется не совсем то, чего вы ожидали. Данная конструкция: ("a1" and "b1" and "c1") выполняет сравнение конкретных строк между собой. Следовательно у вас находилось "самая большая" строка из всех вариантов, а не объединение строк в нужную комбинацию.

→ Ссылка