我有一个程序,可以跟踪各种成功的情况things using collections.Counter
— 每一次成功thing增加相应的计数器:
import collections
scoreboard = collections.Counter()
if test(thing):
scoreboard[thing]+ = 1
然后,对于未来的测试,我想偏向things其中取得了最大的成功。Counter.elements()
似乎对此很理想,因为它返回重复次数等于计数的元素(以任意顺序)。所以我想我可以这样做:
import random
nextthing=random.choice(scoreboard.elements())
但不,这会引发类型错误:“itertools.chain”类型的对象没有 len()。可以,然后呢random.choice无法使用迭代器 https://stackoverflow.com/a/4859328/479426。但是,在这种情况下,长度是已知的(或可知的)——它是sum(scoreboard.values())
.
我知道迭代未知长度的列表并公平地随机选择一个元素的基本算法,但我怀疑还有更优雅的东西。我应该在这里做什么?
您可以通过使用轻松地做到这一点itertools.islice http://docs.python.org/library/itertools.html#itertools.islice获取可迭代对象的第 N 项:
>>> import random
>>> import itertools
>>> import collections
>>> c = collections.Counter({'a': 2, 'b': 1})
>>> i = random.randrange(sum(c.values()))
>>> next(itertools.islice(c.elements(), i, None))
'a'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)