过滤笛卡尔积使其适合内存

Filter Cartesian product so it fits in memory

我有一个列表列表

y = [[a, b, c], ...]

我想生成所有列表之间的笛卡尔积。 python 中的 itertools.product 会同时执行此操作,所以我无法将它们保存在内存中。

虽然我只需要输出的一个子集。为了论证,只说总和为 1 的那些。我需要按顺序获取结果,这样我就可以删除那些不需要的。

基本上

[x for x in itertools.product(*y) if sum(x)==1]

其中 itertools.product 不急于评估。

只需用 () 替换你的方括号:这将使你的结果表达式成为 generator (延迟计算)而不是列表(将包含所有它在内存中的内容)。

(x for x in itertools.product(*y) if sum(x)==1)

itertools.product已经懒了。 itertools 模块中的所有函数都是 - 它们 return 是一个迭代器,从不列出。所以只需遍历产品并过滤:

for prod in itertools.product(*y):
    if sum(prod) == 1:
        print(filtered_result)

或者,built-in 函数 filter(function, iterable) 还:

Construct[s] an iterator from those elements of iterable for which function returns true.

因此您还可以从乘积迭代器迭代派生过滤迭代器:

for filtered_result in filter(lambda x: sum(x) == 1, product(*y)):
    print(filtered_result)