On Jan 5, 8:14 am, [EMAIL PROTECTED] wrote: > On Jan 5, 5:07 pm, [EMAIL PROTECTED] wrote: > > > Hello, Paul and Arnaud. > > While I think about your answers: do you think there is any way to > > avoid shuffle? > > It may take unnecessary long on a long list most of whose elements > > have the property. > > Umm... > You provide nice answers in the case many elements are picked from the > same list. > Any ideas for the case when the picker is called many times on a > program, but never twice with the same list?
Here's my stab: from random import randint, seed from time import time from sys import stdout seed(time()) iterations = 0#DEBUG def pick_random(seq, prop=bool): temp = list(seq) global iterations#DEBUG while temp: iterations += 1#DEBUG i = randint(0, len(temp) - 1) if prop(temp[i]): return temp[i] else: del temp[i] def generate_list(length): l = list() for x in xrange(length): l.append(randint(0,1) * randint(1,1000)) return l count = 0 for x in xrange(1000): count += 1 print pick_random(generate_list(1000)), print print "AVERAGE ITERATIONS:", float(iterations) / count The average number of iterations is 1/p where p is the chance of your property being true. It's independent of list size! Just remove the DEBUG lines and it's ready for use. --Buck -- http://mail.python.org/mailman/listinfo/python-list