Python. Использование циклов со счетчиками и с проверкой списков

У меня есть код:

from random import choice

комбинация = ['w', 4, 5, 2, 'a', 8, 3, 9, 7, 6, 'g', 'r', 1, 'y']

my_ticket = []

def random():
    return choice(комбинация)
    
def перебор():
    print("Выигрышная комбинация:")
    for _ in range(4):
        my_ticket.append(random())


    
перебор()
print(my_ticket)

У меня дальше есть задача создать цикл, который будет перебирать комбинации, и когда цикл найдет нужную комбинацию (как в my_ticket), то он должен остановиться и написать сколько попыток потребовалось, чтобы найти нужную комбинацию.

Я переписал код выше:

from random import choice

комбинация = ['w', 4, 5, 2, 'a', 8, 3, 9, 7, 6, 'g', 'r', 1, 'y']

my_ticket = []

my_target = ['a', 4, 5, 'g']

def random():
    return choice(комбинация)
    
def перебор():
    for _ in range(4):
        print(random())


count = 1
def цикл():
        while True:
            for _ in range(4):
                my_ticket.append(random())
            count += 1
            if my_ticket == my_target:
                print(my_ticket)


цикл()

но он не работает


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

Автор решения: Ivan Main
from random import choice


def random(combination):
    return choice(combination)


def enumeration(combination, my_ticket):
    print("Выигрышная комбинация:")
    for _ in range(4):
        my_ticket.append(random(combination))

def run_times(my_ticket, combination):
    count = 0
    while True:
        win_ticket = [random(combination) for i in range(4)]
        if win_ticket == my_ticket:
            break
        else:
            count += 1
    return count, win_ticket


combination = ['w', 4, 5, 2, 'a', 8, 3, 9, 7, 6, 'g', 'r', 1, 'y']
my_ticket = []

enumeration(combination, my_ticket)
print(my_ticket)
solution = run_times(my_ticket, combination)
print(f'Мы получили ваш выигрышный билет {solution[1]}.\nДля нахождения потребовалось {solution[0]} попыток')
→ Ссылка
Автор решения: Сергей

Ниже исправленный код с комментариями в тексте по каждому исправлению. Изучите внимательно эти темы:
а) области видимости, особенно функции;
б) счетчики (просто на бумажке прикиньте, как они работают); в) списки (рекомендация моя "не забывайте очищать список каждый раз" была проигнорирована).

from random import choice

combination = ['w', 4, 5, 2, 'a', 8, 3, 9, 7, 6, 'g', 'r', 1, 'y']

my_target = ['a', 4, 5, 'g']


def random():
    return choice(combination)


def perebor():
    for _ in range(4):
        print(random())


def cycle():
    # 1) Перенесли счетчик в область видимости функции
    # 2) Начинается он с 0, так как не было еще попыток.
    count = 0
    while True:
        # Обнуляем список каждый раз, или он бесконечно будет расти и не совпадет никогда
        my_ticket = []
        for _ in range(4):
            my_ticket.append(random())
        count += 1
        if my_ticket == my_target:
            # Добавили счетчик на вывод
            print(my_ticket, count)
            # Прервать цикл надо, если совпало, а то без конца будет работать
            break


cycle()
→ Ссылка