On Sat, 05 Jan 2008 08:14:46 -0800, caca 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?
ISTM the best thing would be to reimplement the shuffle algorithm, but to
stop shuffling as soon as you get a hit. The drawback is that it's a
destructive operation, but that doesn't sound like it's an issue for you.
Here's something for starters:
def random_element_with_property(x,test_property_func):
for i in xrange(len(x)-1):
j = random.randrange(i+1,len(x))
tmp = x[j]
if test_property_func(tmp):
return tmp
x[j] = x[i]
x[i] = tmp
return None
Then, for example, use it like this:
def odd(i): return i&1
e = random_element_with_property(range(20),odd)
Carl Banks
--
http://mail.python.org/mailman/listinfo/python-list