随机选择python中的标准

时间:2014-10-07 23:40:21

标签: python

我想(伪)从符合条件的列表中随机选择一个对象。我有一个函数可以满足我需要的一个标准:

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

但每次我想要一个新标准时,我都需要编写一个新函数。有更简单的方法吗?

2 个答案:

答案 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'])

我会过滤掉所有不符合条件的条目,并从剩下的条目中进行选择。