Ho un programma in cui sto tenendo traccia del successo delle varie cose con collections.Counter
- ogni successo di una cosa incrementi del corrispondente contatore:Come posso ottenere una scelta casuale ponderata dalla classe Counter di Python?
import collections
scoreboard = collections.Counter()
if test(thing):
scoreboard[thing]+ = 1
Poi, per le prove future, voglio inclinare verso cose che hanno generato il maggior successo. Counter.elements()
sembrava ideale per questo, dal momento che restituisce gli elementi (in ordine arbitrario) ripetuti un numero di volte uguale al conteggio. Così ho pensato che avrei potuto solo fare:
import random
nextthing=random.choice(scoreboard.elements())
Ma no, che solleva TypeError: oggetto di tipo 'itertools.chain' non ha len(). Va bene, quindi random.choice
can't work with iterators. Ma, in questo caso, la lunghezza è nota (o conoscibile) - è sum(scoreboard.values())
.
Conosco l'algoritmo di base per scorrere un elenco di lunghezza sconosciuta e prelevare in modo equo un elemento a caso, ma sospetto che ci sia qualcosa di più elegante. Cosa dovrei fare qui?
stai appena svolta 'scoreboard.elements()' in una lista? – delnan
@delnan - vedere il commento su [risposta di larsks] (http://stackoverflow.com/a/9084700/479426) di seguito. – mattdm