Python itertools 产品,但有条件?

标签 python python-2.7 product python-itertools

我有一个函数 fun,它接受多个参数 p0、p1、.. 对于每个参数,我都给出了一个可能值的列表:

p0_list = ['a','b','c']
p1_list = [5,100]

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

for i in itertools.product(*[p0,p1]):
    print fun(i)

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

[('a', 5), ('a',100), ('b', 5), ('c',5), ('c', 100)]

所以 ('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]

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

最佳答案

这是一个适用于此的通用过滤器函数:

def without_duplicate_item(groups, index, item):
    seen = False
    for group in groups:
        if group[index] == item:
            if seen:
                continue
            seen = True
        yield group

用法:

param_groups = itertools.product(*[p0_list, p1_list])

param_groups = without_duplicate_item(param_groups, 0, "b")

您当然可以不断为不同的参数添加过滤器。与存储以前的调用相比,这应该非常节省内存,因为它实际上只为每个过滤器存储一个 bool 值 seen

关于Python itertools 产品,但有条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21464743/

相关文章:

php - 升级到 3.X 后 WooCommerce 自定义代码中断

javascript - 如何在数量框中添加增加和减少按钮

python - 如何在 Python 中获取组合 Unicode 字符串的 "visible"长度?

python - 渲染表单字段随机时间

python - 根据键中的不同值复制相同的数据并创建嵌套字典

Python 2.7 Tkinter 和 ftplib

python - 无法使用python在谷歌驱动器上上传大文件

php - 从 WP_Query 中排除 WooCommerce 产品类别

python - imaplib2 : imap. gmail.com 处理程序 BYE 响应:系统错误

python - GroupBY 频率计数 JSON 响应 - 嵌套字段