Код не дорабатывает указанные задачи до конца

Имеется следующий код на Python. Это код бота, и задачи этого кода следующие:

Код создает стол, а также вставляет карты на изображение. Карты генерируются перед наложением на стол.

Вся проблема заключается в том, что код генерирует 10 карт, но при этом первый цикл генерации он обрабатывает некорректно, и может упустить несколько карт. Как это исправить?

    q = 0
    tables = []
    while q < 2:
        # Размеры игрального стола
        table_width = 1280
        table_height = 720

        # Размеры карт
        card_width = 179
        card_height = 250

        # Создаем изображение игрального стола
        table_image = Image.open("Pictures/stol.png")

        # Загружаем изображения карт
        cards6 = ['6c', '6b', '6k', '6p']
        cards7 = ['7c', '7b', '7k', '7p']
        cards8 = ['8c', '8b', '8k', '8p']
        cards9 = ['9c', '9b', '9k', '9p']
        cards10 = ['10c', '10b', '10k', '10p']
        cardsK = ['Kc', 'Kb', 'Kk', 'Kp']
        cardsQ = ['Qc', 'Qb', 'Qk', 'Qp']
        cardsJ = ['Jc', 'Jb', 'Jk', 'Jp']
        cardsA = ['Ac', 'Ab', 'Ak', 'Ap']
        cards = {"6": cards6, "7": cards7, "8": cards8, "9": cards9, "10": cards10, "K": cardsK, "Q": cardsQ, "J": cardsJ,
                 "A": cardsA}
        appcard = []
        c = 0
        print(list(cards))
        while c <= 11:
            ca = random.choice(list(cards))

            carst = random.choice(cards[ca])
            print(carst)
            c = c + 1
            appcard.append(carst)

        await asyncio.sleep(3)
        le = {}
        for i in appcard:
            le[i] = False
        tables.append([rnd, appcard, le])
        q = q + 1

    return tables

Функция вызывается один раз.


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

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

Ваш метод, выбирающий карты из колоды по одной, может выбрать несколько раз одну и ту же карту. Вы не проверяете, что карта уже была выбрана. Далее, словарь не может содержать одинаковые элементы, поэтому в итоговом словаре будет меньше карт, чем нужно, если были повторы одной и той же карты.

Проще всего выбрать нужное количество карт из колоды за один присест, просто перетасовав предварительно колоду и выбрав сверху из неё нужное число карт.

Пример кода:

from random import shuffle

cards = [f'{n}{s}' for n in ['7','8','9','10','J','Q','K','A'] for s in 'cbkp']
shuffle(cards)
choice = cards[:11]
print(choice)

Пример вывода (он случайный):

['Jb', 'Kb', '9b', 'Ap', '9k', 'Jp', 'Kp', 'Qc', '10c', '8p', 'Ab']
→ Ссылка