我有哪里我保持的各种事情成功的轨道使用collections.Counter
程序 - 的事情每个成功递增相应的计数器:我如何从Python的Counter类获得加权随机选择?
import collections
scoreboard = collections.Counter()
if test(thing):
scoreboard[thing]+ = 1
然后,对于以后的测试中,我想倾向于东西哪些产生了最大的成功。 Counter.elements()
似乎是理想的选择,因为它返回的元素(以任意的顺序)重复的次数等于计数。所以,我想我可能只是这样做:
import random
nextthing=random.choice(scoreboard.elements())
但是,没有,这引起了类型错误:类型的对象itertools.chain'没有LEN()。好的,那么random.choice
can't work with iterators。但是,在这种情况下,长度已知(或可知) - 它是sum(scoreboard.values())
。
我知道通过一个未知长度的列表迭代的基本算法,并随机挑选一个元素,但我怀疑有更优雅的东西。我应该在这里做什么?
如何只是把'scoreboard.elements()'到列表中? – delnan 2012-01-31 18:10:56
@delnan - 请参阅下面[larsks's answer](http://stackoverflow.com/a/9084700/479426)上的评论。 – mattdm 2012-01-31 18:29:58