Python列表索引超出范围列表

时间:2013-11-20 21:06:45

标签: python

我是编程新手,正在为这个项目创建一个程序的一部分: http://www.reddit.com/r/beginnerprojects/comments/19ot36/project_a_variation_of_21/ 当我遇到索引错误。使用Stackoverflow答案,我最初通过制作

来纠正错误
random.randrange(0,len(cards)+1)]

而不是

random.randrange(0,53,1)]

然而它继续给我这个错误。如果你运行50次它可能不会给你一个错误,但它也可能在你第一次或第五次运行时给你一个错误。对于圆形功能,我希望能够从单个牌组中处理牌,每次我拿出一张卡牌将其从牌组中移除。任何建议将非常感谢! - 托马斯

错误讯息:

Traceback (most recent call last):
  File "<string>", line 420, in run_nodebug
  File "<module2>", line 39, in <module>
  File "<module2>", line 30, in round
  File "<module2>", line 26, in draw

IndexError:列表索引超出范围

代码:

def round():
    cards = ["2", "2", "2", "2", "3", "3", "3", "3", "4", "4", "4", "4", "5",
    "5", "5", "5", "6", "6", "6", "6", "7", "7","7","7","8", "8", "8", "8", "9",
    "9", "9", "9", "10", "10", "10", "10", "Jack", "Jack", "Jack", "Jack",
    "Queen", "Queen", "Queen", "Queen", "King", "King", "King", "King", "Ace", "Ace",
    "Ace", "Ace"]
    def draw():
        return cards[random.randrange(0,len(cards)+1,1)]
    acards = []
    aroundscore = 0
    acards.append(draw())
    acards.append(draw())
    print(acards)
    print(acards)
    cardsvalues = {"2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9,
    "10":10, "Jack":10, "Queen":10, "King":10, "Ace":1}
    for i in acards:
        print(cardsvalues[i])

4 个答案:

答案 0 :(得分:1)

您使用len(cards)的原因是因为如果您发卡,卡的数量可能会发生变化!您的行应该是len(cards)而不是len(cards) + 1,因为如果您在cards的最大长度上添加一行,那么它可以随机选择一个大于您拥有的卡数量的数字,从而导致IndexError

答案 1 :(得分:1)

您的draw函数发生错误,因为您的范围过大:random.randrange(0,len(cards)+1,1)。考虑一下,例如len(cards)是否为3.然后,rangerange将被0, 4, 1调用,这意味着它将返回0到3之间的整数。但索引{{1不存在 - 这是一个错误的错误。

我建议您只使用3来完成您想要的任务。它更加简洁和可读。

random.choice

答案 2 :(得分:0)

使用random.randint(0,51) 我认为你对卡的长度感到困惑。

答案 3 :(得分:0)

我同意上述建议。但是还有一件事:randrange并不保证生成的数字会有所不同。您可以获得一些相同值的数字。对于纸牌游戏来说非常糟糕 - 因为游戏中的每张牌都必须是唯一的。我建议使用random.shuffle并从头开始逐一从名单中取出卡片。