Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python &引用;Pop索引超出范围“;一副牌_Python_Playing Cards - Fatal编程技术网

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
,牌组的范围不同。正如另一个答案所指出的,你没有在下手后重新添加牌,我假设这是故意的行为,但你是否忘记在重新洗牌之前重建牌组?这将有助于显示如何调用这些的流程。你确定你的甲板吗