Удаление элемента из списка с помощью переменной - PullRequest
0 голосов
/ 04 января 2019

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

TypeError: list indices must be integers or slices, not str

Ответы [ 4 ]

0 голосов
/ 04 января 2019

Проблема в том, что вы конвертируете cardNum в строку при некоторых обстоятельствах, поэтому ответ - прекратить это делать.Лично я бы назвал карту отдельным методом:

def cardName(cardNum):
    if cardNum == 11:
        return "jack"
    elif cardNum == 12:
        return "queen"
    elif cardNum == 13:
        return "king"
    elif cardNum == 0:
        return "ace"
    return str(cardNum)


def dealPlayer():
    cardSuit = random.randrange(1, 5) #Decide card suit#
    if cardSuit == 1:
        cardNum = random.randrange(0, 14) #Decide card num#
        print ("Your first card is the", cardName(cardNum), "of clubs.")
        del Clubs[cardNum]

Примечание: ваш random.randrange(0, 13) был неверен, он не будет включать 13. Вы либо хотите использовать random.randrange(0, 14), либо использовать random.randint(0, 13).

Я думаю, вам также следует рассмотреть возможность использования наборов вместо списков для карт и колоды, поскольку удаление составляет списки O (1) против O (n).

Кроме того,То, как вы следите за вещами, тоже не идеально.Если Clubs означает набор доступных карт, то вам действительно следует выбрать следующую карту из этого набора.Что-то вроде:

cardNum = random.choice(Clubs)

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

deck = set([])
for suit in ["clubs", "spades", "hearts", "diamonds"]:
    for i in range(14):
        deck.add((suit, i))

Затем удалите каждую карту из deck по своему выбору, используя random.sample(deck, 1)[0]:

>>> random.sample(deck, 1)[0]
('spades', 9)

(было бы здоровоесли бы вы могли использовать random.choice() здесь, но он не принимает набор)

0 голосов
/ 04 января 2019

Вы присваиваете строковое значение переменной cardNum всякий раз, когда случайное значение cardNum равно 0, 11, 12 или 13.

Когда вы получаете доступ к списку Clubs после cardNum Переменная была установлена, скажем, "king", вы делаете это по существу:

Clubs["king"]  # Invalid access (str as list index)

Вы можете получить доступ к индексам списка только как целые числа (0, 1, 2 и т. д.) и толькоте индексы, которые заполняются в списке (допустимые индексы).

Поскольку вы назначаете строковое значение для печати, вам просто нужно использовать другую переменную для хранения имени карты, например:

def dealPlayer():
    cardSuit = random.randrange(1, 5) #Decide card suit#
    if cardSuit == 1:
        cardNum = random.randrange(0, 14) # Decide card number [0,14), upper exclusive
        if cardNum == 11:
            cardName = "jack"
        elif cardNum == 12:
            cardName = "queen"
        elif cardNum == 13:
            cardName = "king"
        elif cardNum == 0:
            cardName = "ace"
        else:
            cardName = cardNum

        print ("Your first card is the", cardName, "of clubs.")
        Clubs.remove(cardNum)

Тогда у вас не будет никаких проблем, потому что cardNum остается неизменным и является целым числом.Обратите внимание, что изменение на Clubs.remove(cardNum).Это правильный способ удалить элемент из списка.

Редактировать

Логика здесь также ошибочна: как только вы удаляете "тройку клубов" (объект по индексу * 1022)* в вашем случае, если 0 - туз) из списка, список будет на одну карту короче, и все карты, которые идут после «трех клубов» в списке, будут уменьшаться на один индекс каждая.Это означает, что если вы ожидаете, что ваш объект с индексом 4 будет «четырьмя клубами», то на самом деле это будет «пятерка клубов», потому что все сбито одним.Вам нужно будет изменить свой дизайн, чтобы учесть это.

0 голосов
/ 04 января 2019

Прежде всего, cardNum - это строка.Вы можете сделать

del Clubs[int(cardNum)]

Но это не даст желаемого результата, оно удалит индексную карточкуNum из списка.То, что вы хотите:

Clubs.remove(cardNum)

Таким образом, del удаляет по индексу list.remove () удаляет по элементу

0 голосов
/ 04 января 2019

Попробуйте использовать приведенный ниже полный код:

def dealPlayer():
    cardSuit = random.randrange(1, 5) #Decide card suit#
    if cardSuit == 1:
        cardNum = random.randrange(0, 13) #Decide card num#
        if cardNum == 11: #Make sure it prints the name not position in list#
            cardNum_ = "jack"
        elif cardNum == 12:
            cardNum_ = "queen"
        elif cardNum == 13:
            cardNum_ = "king"
        elif cardNum == 0:
            cardNum_ = "ace"
        print ("Your first card is the", cardNum_, "of clubs.")
        del Clubs[cardNum]
        print(Clubs)

Немного измените имена переменных, чтобы они работали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...