在Python 3.3中执行代码时出现看似随机的错误

时间:2014-02-12 17:59:57

标签: python python-3.x keyerror

以下是我编写的程序中的一部分代码,这些程序非常基本。

pc1 = random.choice(cards)
cca1 = random.choice(cards)
while (pc1 == cca1):
    cca1 = random.choice(cards)
ccb1 = random.choice(cards)
while (pc1 == ccb1) or (cca1 == ccb1):
    ccb1 = random.choice(cards)

pc1cca1ccb1只是变量的名称,因易用而缩短。这部分代码的作用是尝试从名为cards的字典中获取3个条目。它使用while函数来确保所选卡片不相同;他们永远是不同的。

这种情况一直持续到我的52字典中有9个唯一变量,除了有时会产生以下错误之外它工作正常:

Traceback (most recent call last):
  File "C:\Python33\Programs\Poker\1.0.py", line 231, in <module>
    ccc2 = random.choice(cards)
  File "C:\Python33\lib\random.py", line 252, in choice
    return seq[i]
KeyError: 0

上面错误中的变量(ccc2)只是前面显示的代码的延续,而且每次都会导致错误的变量。

错误有时只会发生(有时程序运行正常,有时会显示错误),并且它出现的行也会随着每次出现而改变。 我理解我的代码效率低下,但我真的只是想停止这个错误,也许还有一些关于如何改进的有用的想法/提示。

再一次;做了它应该但却无法明确地返回在看似随机的时间提到的错误与一个看似随机的原因网站。

提前致谢!

1 个答案:

答案 0 :(得分:5)

random.choice的工作方式是针对序列而非映射而设计的。它选择索引,因此有时会尝试cards[0],这显然不是有效密钥。当然,错误看似随机的原因是因为它取决于random所选择的值!

您可以通过明确选择序列来解决此问题:

random.choice(list(cards))

为了更全面地改进您的代码,请注意random还包括sample

rcards = random.sample(list(cards), 3) # pick three random cards

请注意,在这两种情况下,我们都会从字典中随机选择 keys