【问题标题】:Seemingly random error appearing when executing code in Python 3.3在 Python 3.3 中执行代码时出现看似随机的错误
【发布时间】:2014-02-12 17:59:57
【问题描述】:

下面是我编写的程序的一部分代码,它绝对是非常基本的。

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 只是变量的名称,为了便于使用而缩写。这部分代码所做的是尝试从名为卡的字典中获取 3 个条目。它使用while函数来确保选择的卡片不一样;它们总是不同的。

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

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) 只是之前显示的代码的延续,并且据说导致错误的变量每次都会更改。

该错误仅在某些时候发生(有时程序运行良好,有时它显示错误),并且它发生的行也随着每次出现而变化。 我知道我的代码效率低下,但我真的只是想阻止这个错误,也许还有一些关于如何改进的有用想法/提示。

再一次;做了它应该做的,但无法识别地返回看似随机的时间提到的错误,原因似乎是随机的。

提前致谢!

【问题讨论】:

    标签: python python-3.x keyerror


    【解决方案1】:

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

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

    random.choice(list(cards))
    

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

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

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

    【讨论】:

    • 太好了,感谢您的回复,我已经根据您的 .keys() 建议编辑了我的代码,现在它似乎工作正常。我也会考虑你对改进我的代码的建议,谢谢你的帮助!
    • 嗨,乔恩,感谢您之前的帮助,只需将您的建议付诸实践,然后意识到我忘了提到我想从字典条目中检索值,而不是键!这可能吗?我该怎么做?
    • 获得密钥后,像往常一样获取值:val = cards[key]。或者,从cards.values() 中随机选择/采样。
    • 感谢您的回复。您建议的第二个选项返回以下错误:Traceback (most recent call last): File "C:\Python33\Programs\Poker\1.0.py", line 212, in &lt;module&gt; pc1 = random.choice(cards.values()) File "C:\Python33\lib\random.py", line 252, in choice return seq[i] TypeError: 'dict_values' object does not support indexing
    • 这是 Py2/Py3 的事情,抱歉:使用 list(cards.values())
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 2012-01-30
    • 2014-02-23
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多