Python &引用;Pop索引超出范围“;一副牌
我现在拥有的是构建一副牌的代码,可以洗牌,也可以从那副牌上构建一只手牌Python &引用;Pop索引超出范围“;一副牌,python,playing-cards,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
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
功能正常工作,并且手牌将始终从牌组中返回两张不同的牌?pop
通过从列表中删除该项来改变列表。因此,列表的长度将小于52
,并且最终将抛出一个错误。每次len(deck)
使用列表的长度,而不是51
对于洗牌,您还可以使用库中的函数random
:
from random import shuffle
## later in the code
shuffle(deck)
pop
通过从列表中删除项目来改变列表。因此,列表的长度将小于52
,并且最终将抛出一个错误。每次len(deck)
使用列表的长度,而不是51
对于洗牌,您还可以使用库中的函数random
:
from random import shuffle
## later in the code
shuffle(deck)
这样写比较安全
card = deck.pop(randint(0,len(deck)-1))
虽然如果你把这个值保存在某个地方会更快
但这也指出了一个问题,那就是你的牌组有问题。您是否希望甲板创建中的循环格式正确?您创建的卡片可能少于52张,因此,当您在高端生成一个整数时,您将捕获该错误。如果它偶尔发生在make_hand(迭代两次)和shuffle(迭代100次)中,也可能发生这种情况
如果您打算在牌发完后洗牌,那么您肯定需要使用len()或以其他方式跟踪牌组大小。即使在make_hand功能中,您也会弹出一张卡,然后仍然尝试从52号的列表中提取,即使您已取出一张卡。将此写为
card = deck.pop(randint(0,len(deck)-1))
虽然如果你把这个值保存在某个地方会更快
但这也指出了一个问题,那就是你的牌组有问题。您是否希望甲板创建中的循环格式正确?您创建的卡片可能少于52张,因此,当您在高端生成一个整数时,您将捕获该错误。如果它偶尔发生在make_hand(迭代两次)和shuffle(迭代100次)中,也可能发生这种情况
如果您打算在牌发完后洗牌,那么您肯定需要使用len()或以其他方式跟踪牌组大小。即使在make_hand功能中,您也会弹出一张卡,然后仍然尝试从大小为52的列表中提取,即使您已取出一张卡。在make_hand
中,您从牌组中取出两张卡。第一个总是会成功,但第二个必须使用仅包含51张牌的牌组,而尝试弹出(52)
的几率仍然是1/52,这将失败
我无法用shuffle
函数重现相同的错误,除非我首先将make__hand
中使用的一组数据传递给它,所以我假设您也这样做了
为了确保这一点,您可以在两个函数中使用
randint(0,len(deck)-1)
。在手动操作中,您可以从牌组中取出两张牌。第一个总是会成功,但第二个必须使用仅包含51张牌的牌组,而尝试弹出(52)
的几率仍然是1/52,这将失败
我无法用shuffle
函数重现相同的错误,除非我首先将make__hand
中使用的一组数据传递给它,所以我假设您也这样做了
为了确保这一点,您可以在两个函数中使用
randint(0,len(deck)-1)
。但是OP在shuffle
的下一行将卡重新添加到牌组中。不,他不在make_hand
函数中。您没有解决shuffle
的问题。我还假设,在make_hand
中从牌组中移除牌不是一个错误,但是,嗯,是的,我移除了这个答案,在我理解我犯了一个错误之后,我也会添加洗牌。谢谢你的评论。我明白你的意思,但我不打算把这张牌重新添加到牌组中,因为第二张牌可能是同一张牌。相反,我改变的是,有一张card1
和card2
牌组的范围不同。但是OP在shuffle
的下一行将牌添加回牌组。不,他不在make_hand
函数中。你没有解决shuffle
的问题。我还假设,在make_hand
中从牌组中移除牌不是一个错误,但是,嗯,是的,我移除了这个答案,在我理解我犯了一个错误之后,我也会添加洗牌。谢谢你的评论。我明白你的意思,但我不打算把这张牌重新添加到牌组中,因为第二张牌可能是同一张牌。相反,我改变的是,有一个card1
和card2
,牌组的范围不同。正如另一个答案所指出的,你没有在下手后重新添加牌,我假设这是故意的行为,但你是否忘记在重新洗牌之前重建牌组?这将有助于显示如何调用这些的流程。你确定你的甲板吗