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