tengo un programa en el que estoy no perder de vista el éxito de varias cosas usando collections.Counter
- cada éxito de una cosa incrementa el contador correspondiente:¿Cómo puedo obtener una selección aleatoria ponderada de la clase de contador de Python?
import collections
scoreboard = collections.Counter()
if test(thing):
scoreboard[thing]+ = 1
Entonces, para las pruebas futuras, quiero inclinar hacia cosas 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 conteo. Así que pensé que sólo podía hacer:
import random
nextthing=random.choice(scoreboard.elements())
Pero no, eso plantea TypeError: objeto de tipo 'itertools.chain' no tiene len(). De acuerdo, entonces random.choice
can't work with iterators. Pero, en este caso, la longitud es conocida (o cognoscible): es sum(scoreboard.values())
.
Conozco el algoritmo básico para iterar a través de una lista de longitud desconocida y escoger un elemento al azar, pero sospecho que hay algo más elegante. ¿Qué debería estar haciendo aquí?
¿Qué tal girando 'scoreboard.elements()' en una lista? – delnan
@delnan - vea el comentario sobre [respuesta de larsks] (http://stackoverflow.com/a/9084700/479426) a continuación. – mattdm