【问题标题】:How can random.shuffle result in a KeyError?random.shuffle 如何导致 KeyError?
【发布时间】:2017-08-23 05:44:30
【问题描述】:

我刚刚收到错误:

Traceback (most recent call last):
  File "./download_documents.py", line 153, in <module>
    paragraphs, used_pages = find_pages(lang, to_extract)
  File "./download_documents.py", line 67, in find_pages
    random.shuffle(page_titles_queue)
  File "/usr/lib/python2.7/random.py", line 291, in shuffle
    x[i], x[j] = x[j], x[i]
KeyError: 1

这让我很困惑。

  1. random.shuffle 似乎适用于零元素列表和一元素列表。
  2. page_titles_queue 是一个元组列表。
  3. random.shuffle(page_titles_queue) 之后的两行,有page_titles_queue.pop(),但这不应该影响随机播放。对吗?

那么 KeyError 的可能原因是什么?

我在 Ubuntu 16.04 上使用 Python 2.7.12

【问题讨论】:

  • 我现在让相同的代码再次运行。让我们看看会发生什么。
  • 您可能对 page_titles_queue 的实际含义有误。
  • 你在字典上运行它:random.shuffle(dict.fromkeys([1, 2, 3])).
  • @AshwiniChaudhary 哎呀......你是对的。我应该删除问题吗?我想这可能对其他人有用。你想发表你的评论作为答案吗?

标签: python python-2.7 random shuffle keyerror


【解决方案1】:

random.shuffle 只是交换项目,发生异常的那一行就清楚地说明了这一点:

x[i], x[j] = x[j], x[i]

其中x 是传入的“序列”。在这种情况下,ij 将是range(0, len(x)) 范围内的值,如果这些ij 中的任何一个不是' t 出现在“序列”中,它会抛出一个Exception。在您的情况下,很可能会引发KeyError

>>> import random
>>> d = {i: i for i in range(7, 10)}
>>> random.shuffle(d)
KeyError: 3

但是,如果字典包含构成 range(0, len(x)) 的键,则它通过交换值来工作:

>>> d = {i: i for i in range(10)}
>>> random.shuffle(d)
>>> d
{0: 7, 1: 9, 2: 3, 3: 4, 4: 0, 5: 2, 6: 1, 7: 6, 8: 8, 9: 5}

如果缺少一个或多个键,它可以工作,或者它可能会抛出一个Exception。这取决于将抽取哪些随机数:

d = {i: i for i in range(1, 10)}
random.shuffle(d)   # works sometimes, but sometimes it throws the KeyError

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多