¿Cómo puedo obtener una selección aleatoria ponderada de la clase Counter de Python?
Tengo un programa en el que hago un seguimiento del éxito de variascosa utilizandocollections.Counter
- cada éxito de unacos incrementa el contador correspondiente:
import collections
scoreboard = collections.Counter()
if test(thing):
scoreboard[thing]+ = 1
Entonces, para futuras pruebas, quiero sesgarme haciacosa que han generado el mayor éxito. @Counter.elements()
parecía ideal para esto, ya que devuelve los elementos (en orden arbitrario) repetidos varias veces igual al recuento. Entonces pensé que podía hacer:
import random
nextthing=random.choice(scoreboard.elements())
Pero no, eso aumentaTypeError: el objeto de tipo 'itertools.chain' no tiene len (). Bueno entoncesrandom.choice
no puede trabajar con iteradores. Pero, en este caso, la longitud es conocida (o conocible): essum(scoreboard.values())
.
Conozco el algoritmo básico para iterar a través de una lista de longitud desconocida y elegir un elemento al azar, pero sospecho que hay algo más elegante. ¿Qué debería estar haciendo aquí?