On Jan 4, 2008 3:47 PM, Neil Cerutti <[EMAIL PROTECTED]> wrote: > On Jan 4, 2008 2:55 PM, <[EMAIL PROTECTED]> wrote: > > > Hello, > > This is a question for the best method (in terms of performance > > only) to choose a random element from a list among those that satisfy > > a certain property. > > > > A simple approach is: > > > > import random > > def random_pick(a_list,property): > > '''Returns a random element from a list that has the property > > > > Returns None if no element has the property > > ''' > > random.shuffle(a_list) > > for i in a_list: > > if property(i): return i > > > I'm pretty sure you don't want to use a destructive random_pick function. > You'll have to shuffle a copy instead to avoid that problem. >
I thought of another one based on combining the above with the linear search idea, minimizing the calls to the predicate function. indexes = range(len(a_list)) random.shuffle(indexes) for ix in indexes: if predicate(a_list[ix]) return a_list[ix] raise ValueError('no matching element in list') -- Neil Cerutti
-- http://mail.python.org/mailman/listinfo/python-list