【发布时间】:2013-05-08 02:28:02
【问题描述】:
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 进行猴子修补以“正常工作”,同时不会破坏或大幅降低当前序列行为的效率吗?
【问题讨论】:
-
好吧,真的……给定一个
dict,你会如何选择一个随机值?它必须内置到dict中才能比一般的d[random.choice(d.keys())]更有效。 -
@Rynah 而不是这个:
d[random.choice(d.keys())],我认为这更有意义:random.choice(d.values())。 -
@rynah 我的观点是
random.choice(d)会选择一个随机键,而不是随机值。这将更符合in和for关键字对dicts 键的操作方式。如果你想要一个随机值,你可以使用random.choice(d.values())(顺便说一句,这在 python 3 上不起作用)。 -
正如@rrenaud 所说,它仍然需要内置到
dict中才能更高效。
标签: python random dictionary