У меня есть программа, в которой я отслеживаю успех различных вещей, используя 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())
.
Я знаю базовый алгоритм для итерации через список неизвестной длины и довольно аккуратный выбор элемента наугад, но я подозреваю, что там что-то более элегантное. Что мне делать здесь?