如何在Python中删除列表中的列表?

时间:2015-10-22 12:40:57

标签: python list

我的程序涉及从牌组中抽出牌,将牌的价值加到我手上,然后从牌组中删除牌(因为我不想两次画同一张牌)。

卡片示例:

card = ["4 of clubs", 4]

不起作用的代码:

card_number = random.randrange(len(deck_cards))
card = deck_cards[card_number][0]
print(card)
hand_value += deck_cards[card_number][1]
deck_cards.remove(card_number)

我不知道我做错了什么,如果我将代码更改为

card_number = random.chioce(deck_cards)

它不会接受card = deck_cards[card_number][0]部分。

怎么办?

2 个答案:

答案 0 :(得分:2)

list.remove将对象而不是索引作为参数。

因此,您应该修改代码以检索卡片并直接使用它:

>>> card = random.choice(deck_cards) # Retrieve an object, not an index
>>> print (card) # card is you card list, i.e.:
["4 of clubs", 4]
>>> print (card[0])
4 of clubs
>>> hand_value += card[1]
>>> deck_cards.remove (card)

请注意,您还可以使用内置的del删除指定索引处的对象:

>>> card_number = random.randrange(len(deck_cards))
>>> card = deck_cards[card_number][0]
>>> print(card)
"4 of clubs"
>>> hand_value += deck_cards[card_number][1]
>>> del deck_cards[card_number]

答案 1 :(得分:0)

random.choice(list)返回列表的随机元素,但列表deck_cards[card_number]期望项目的位置从列表中检索(因此是整数)。所以只说明card = random.choice(deck_cards)[0]就足够了。

此外,使用列表作为卡的再现是一个糟糕的选择,因为它不代表卡的对象特征。如果您为卡片编写了自己的类,那么您的代码将变得更具可读性。如果这个类看起来像这样:

class Card(object):
    def __init__(self, name, value):
        self.name = name
        self.value = value

并且你实例化了一张像card = Card('4 of clubs', 4)这样的卡片,你可以编写像hand_value = deck_cards[index].value这样的代码并摆脱那些丑陋的指数。对于诅咒,你必须为这个班级编写自己的字符串演示者,以便轻松输出卡片,但这也不难。

所以(没有那个字符串代表性代码)你的问题会像这样解决:

card = random.choice(deck_cards)
print('{},{}'.format(card.name, card.value))
hand_value += card.value
deck_cards.remove(card)