random.choice用dicts打破

时间:2013-05-08 02:28:02

标签: python random dictionary

random.choice限制输入必须是序列。这会导致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

此外,set以及collections模块中的其他一些容器根本不起作用。

除了我认为random.choice的实现是球(没有充分的理由为什么random.choice(d)不应该以明显的方式工作),什么是获得随机的pythonic方法选择非序列集合?

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

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

1 个答案:

答案 0 :(得分:3)

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