过滤笛卡尔积使其适合内存
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)
我有一个列表列表
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)