ActiveState Code

Recipe 117241: windex.py


weighted choice from list

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import random

def windex(lst):
	'''an attempt to make a random.choose() function that makes weighted choices
	
	accepts a list of tuples with the item and probability as a pair
	like: >>> x = [('one', 0.25), ('two', 0.25), ('three', 0.5)]
	>>> y=windex(x)'''
	n = random.uniform(0, 1)
	for item, weight in lst:
		if n < weight:
			break
		n = n - weight
	return item

Discussion

This makes weighted random choices just as the doc string says. We batted this around on the tutor list a while and folks there imporved it, but whatever flaws remain are mine.

Comments

  1. 1. At 10:34 p.m. on 18 jun 2006, Anonymous said:

    Generalize to arbitery weight. Weights are not need to add up to 1.0

    import random
    
    def windex(lst):
        '''an attempt to make a random.choose() function that makes weighted choices
    
        accepts a list of tuples with the item and probability as a pair'''
    
            wtotal = sum([x[1] for x in lst])
        n = random.uniform(0, wtotal)
        for item, weight in lst:
            if n &lt; weight:
                break
            n = n - weight
        return item
    

Sign in to comment