python - random.choice 被字典破坏了

标签 python random dictionary

random.choice 输入应该是 sequence .这会导致 dict 出现奇怪的行为,它不是序列类型但可以像这样下标:

>>> d = {0: 'spam', 1: 'eggs', 3: 'potato'}
>>> random.choice(d)
'spam'
>>> random.choice(d)
'eggs'
>>> random.choice(d)
'spam'
>>> random.choice(d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/random.py", line 274, in choice
    return seq[int(self.random() * len(seq))]  # raises IndexError if seq is empty
KeyError: 2

此外,random.choicesetcollections 模块中的一些其他容器上根本不起作用。

为什么 random.choice(d) 不应该以明显的方式工作,返回一个随 secret 钥,这是有充分理由的吗?

我考虑过 random.choice(list(d))random.sample(d, 1)[0] 但希望可能有更有效的方法。 random.choice 能否在不降低序列当前行为的情况下得到改进?

最佳答案

可以看到this thread关于 2006 年关于 random.choice 不适用于集合的 Python 错误跟踪器。在算法上可以使其以相同的渐近效率工作,但它需要来自 set/dict 数据结构的自定义支持,或者接口(interface)中的新方法。 python 开发人员认为不需要它。

关于python - random.choice 被字典破坏了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16431703/

相关文章:

java - 如何让每次点击时获得不同的颜色?

python - 嵌套字典到嵌套元组

python - 如何创建这个变量?

Python 使用错误版本的 pymongo

python - supervisord 环境变量设置应用程序

python - 写入变量然后写入文件还是直接写入文件?

python - unicodedata.digit 和 unicodedata.numeric 有什么区别?

php - 在 PHP 中生成快速伪随机数据

random - 在 TensorFlow 图中使用 if 条件

java - 如何防止用作映射值的列表被修改?