我想(伪)从符合条件的列表中随机选择一个对象。我有一个函数可以满足我需要的一个标准:
from random import randint
def choose(array):
return array[randint(0,len(array)-1)]
def choose_c(array):
result = 'r'
while result[-1] == 'r':
result = choose(array)
return result
但每次我想要一个新标准时,我都需要编写一个新函数。有更简单的方法吗?
答案 0 :(得分:2)
一种方法是让你的choice_c
函数接受一个可调用的函数,它将在随机抽样的结果上进行评估,直到它的计算结果为False
,此时将返回随机样本。
def choice_c(array, criterion=None):
result = choose(array)
if criterion:
while criterion(result):
result = choose(array)
return result
def r_criterion(some_sample):
return some_sample == "r"
def gt5_criterion(some_sample):
return some_sample > 5
choice_c(array, r_criterion)
choice_c(array, gt5_criterion)
这也可以使用dropwhile
模块中的takewhile
和/或itertools
来完成,如果这将被大量使用,则可能值得制作choose
函数表现为使用此实现的生成器。
from itertools import dropwhile
def choose(array):
while True:
yield array[randint(0,len(array)-1)]
def choice_c(array, criterion=None):
gen = choose(array)
return next(dropwhile(criterion, gen)) if criterion else next(gen)
当然,在这两种情况下,这都会给您带来编写良好单元测试的负担,或者确保标准功能对阵列内容有意义,并且任何错误都得到正确处理,并且您不会; t遍历while
部分中的无限生成器......
答案 1 :(得分:1)
谢谢。我找到了我想要的答案:
from random import randint
def choose(array):
return array[randint(0,len(array)-1)]
array = ['foo','bar','baz']
print choose([i for i in array if i[-1] != 'r'])
我会过滤掉所有不符合条件的条目,并从剩下的条目中进行选择。