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

Rus*_*man 0 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)
Run Code Online (Sandbox Code Playgroud)

pc1,cca1ccb1只是变量名,缩短了易用性.这部分代码的作用是尝试从名为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
Run Code Online (Sandbox Code Playgroud)

上面(ccc2)错误中的变量只是先前显示的代码的延续,并且该变量可能导致错误每次都发生变化.

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

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

提前致谢!

jon*_*rpe 5

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

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

random.choice(list(cards))
Run Code Online (Sandbox Code Playgroud)

为了更一般地改进您的代码,请注意random还包括sample:

rcards = random.sample(list(cards), 3) # pick three random cards
Run Code Online (Sandbox Code Playgroud)

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