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
进行猴子修补以“正常工作”而不会破坏或大幅降低序列当前行为的效率吗?
答案 0 :(得分:3)
您可以在2006年的Python bug跟踪器上看到this thread关于random.choice不适用于集合。它在算法上可以使它以相同的渐近效率工作,但它需要来自set / dict数据结构的自定义支持,或者接口中的新方法。 python开发人员认为不需要它。