" Pop索引超出范围"对于卡片组

时间:2015-04-23 15:59:50

标签: python playing-cards

我目前所拥有的是建造一副牌,改组牌组以及从那张牌组建一只手的代码。

from random import randint

def make_deck():
    deck = []
    for suit in suits:
        for rank in ranks:
           deck.append((suit,rank))
    return deck

suits = ['spades','hearts','diamonds','clubs']
ranks = ['ace','two','three','four','five','six','seven','eight','nine','ten','jack','queen','king']

deck = make_deck() #list of cards

def shuffle(deck):
    for k in range(100): # do it 100 times
        card = deck.pop(randint(0,51))
        deck.append(card)

def make_hand():
    hand = []
    for k in range(2):
        card = deck.pop(randint(0,51))
        hand.append(card)
    return hand

hand = make_hand()

当我运行程序时,打印deck会给我我喜欢的卡片列表,然后当我尝试洗牌时,我得到一个错误,指出pop索引超出范围。不太确定为什么它会超出索引,因为范围(0,51)代表了牌组的所有52张牌。

当我尝试使用make_hand()函数时出现相同的错误,但并非总是如此。我错误地使用pop方法吗?我需要更改什么才能使shuffle功能正常工作,而hand将始终从套牌中返回两张不同的牌?

3 个答案:

答案 0 :(得分:3)

pop通过从列表中删除项目来改变列表。因此,列表的长度将小于52,并且最终会抛出错误。不是51,而是每次使用列表的长度len(deck)

对于改组,您还可以使用库shuffle中的函数random

from random import shuffle
## later in the code 
shuffle(deck)

答案 1 :(得分:2)

将此作为

更安全
card = deck.pop(randint(0,len(deck)-1))

如果你在某个地方保存这个值,它会更快。

但这也指出了你的套牌有问题的问题。你是否正确格式化甲板创建中的循环?您可能创建的卡少于52张,因此当您在高端生成一个整数时,您将捕获该错误。如果它偶尔发生在make_hand(你在那里迭代两次)并且经常在shuffle(你迭代100次)中,这似乎也很可能。

如果您的意图是在发牌后洗牌,那么您肯定需要使用len()或以其他方式跟踪牌组大小。即使在make_hand功能中,您也会弹出一张卡片,然后仍然尝试从大小为52的列表中进行绘制,即使您已经取出了卡片。

答案 2 :(得分:1)

ims.readUTF()中,你从牌组中取出2张牌。第一个将永远成功,但第二个必须使用仅包含51张牌的牌组,而在尝试make_hand时仍有1/52的机会失败。

我无法使用pop(52)函数重现相同的错误,除非我将shuffle首先使用的套牌传递给它,所以我假设' m你做了什么。

可以肯定的是,您可以在两个函数中使用make_hand