4

random.choice输入必须是一个序列是有限制的。这会在 a 上导致不明显和多毛的行为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

此外,它在 a 和模块中 的set其他一些容器上根本不起作用。collections

除了我认为random.choiceis balls 的这种实现(没有充分理由不random.choice(d)应该以明显的方式工作)之外,从非序列集合中获取随机选择的 Python 方法是什么?

我考虑过random.choice(list(d))random.sample(d, 1)[0]但希望可能有其他不那么丑陋的方法。

可以random.choice在不破坏或大幅降低序列当前行为的效率的情况下进行猴子修补以“正常工作”吗?

4

1 回答 1

4

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

于 2013-05-08T02:33:55.497 回答