Python itertools 产品,但有条件?

Hei*_*urt 5 python product python-itertools python-2.7

我有一个函数 fun 需要几个参数 p0,p1,.. 对于每个参数,我给出了一个可能值的列表:

p0_list = ['a','b','c']
p1_list = [5,100]
Run Code Online (Sandbox Code Playgroud)

我现在可以为 p0,p1 的每个组合调用我的函数

for i in itertools.product(*[p0,p1]):
    print fun(i)
Run Code Online (Sandbox Code Playgroud)

现在问题来了:如果我已经知道参数 p1 只对 fun 的结果有影响,如果 p0 是 'a' 或 'c' 怎么办?在这种情况下,我需要我的参数组合列表看起来像:

[('a', 5), ('a',100), ('b', 5), ('c',5), ('c', 100)]
Run Code Online (Sandbox Code Playgroud)

所以 ('b', 100) 只是被省略了,因为这将是对乐趣的不必要评估。

我的最终解决方案

param_lists = [['p0', ['a','b','c']],['p1', [5,100]]]
l = itertools.product(*[x[1] for x in param_lists])
l = [x for x in l if not x[0] == 'b' or x[1]==5]
Run Code Online (Sandbox Code Playgroud)

我将这种方法用于 5 个参数和各种条件,并且效果很好。它也很容易阅读。这段代码的灵感来自 Corley Brigmans 和 nmcleans 的回答。

Cor*_*man 1

您可以生成它,然后抑制“重复项”。但单独生成可能更好:

p0_list = ['a', 'b', 'c']
p0_noarg1 = ['b']
sp0_noarg1 = set(p0_noarg1)
p0_arg1 = [x for x in p0_list if x not in sp0_noarg1]
p1_list = [5, 100]

total_list = [x for x in itertools.product(p0_arg1, p1_list)] + [x for x in itertools.product(p0_noarg1, p1_list[:1])]
Run Code Online (Sandbox Code Playgroud)