У меня есть программа, в которой я отслеживаю успех различных вещей , используя collections.Counter
- каждый успех вещи увеличивает соответствующий счетчик:
import collections
scoreboard = collections.Counter()
if test(thing):
scoreboard[thing]+ = 1
Затем, для будущих тестов, я хочу перейти к вещам , которые принесли наибольший успех.Counter.elements()
казалось идеальным для этого, так как он возвращает элементы (в произвольном порядке), повторенные количество раз, равное количеству.Поэтому я решил, что могу просто сделать:
import random
nextthing=random.choice(scoreboard.elements())
Но нет, это вызывает TypeError: объект типа 'itertools.chain' не имеет len () .Итак, random.choice
не может работать с итераторами .Но в этом случае длина известна (или может быть известна) - это sum(scoreboard.values())
.
Я знаю основной алгоритм для перебора списка неизвестной длины и честного выбора элемента наугад, но я подозреваю,что есть что-то более элегантное.Что мне здесь делать?