给定列表l
并且列表元素的所有组合都可以在迭代所有组合时删除包含x
的任何组合,这样您就不会考虑包含x
的组合在删除后的迭代过程中?
for a, b in itertools.combinations(l, 2):
if some_function(a,b):
remove_any_tup_with_a_or_b(a, b)
我的列表l
非常大,所以我不想将这些组合保留在内存中。
答案 0 :(得分:2)
实现这一目标的一个便宜技巧是使用动态更新的set
排除值通过不相交测试进行过滤,但实际上不会避免生成您希望排除的组合,因此它不是主要的性能好处(尽管filter
使用C内置函数(如isdisjoint
将比使用if
语句的Python continue
检查更快,通过推送filter
工作到C层):
from future_builtins import filter # Only on Py2, for generator based filter
import itertools
blacklist = set()
for a, b in filter(blacklist.isdisjoint, itertools.combinations(l, 2)):
if some_function(a,b):
blacklist.update((a, b))
答案 1 :(得分:0)
如果要从组合列表x
中删除包含数字itertools.combinations(l, 2)
的所有元组,请考虑您从集{{1}中进行一对一映射(数学上讲) 1}}到itertools.combinations([i for i in range(1,len(l)], 2)
不包含数字itertools.combinations(l, 2)
。
示例:强>
x
中不包含数字1的所有组合的集合由itertools.combinations([1,2,3,4], 2)
给出。请注意,此列表中的元素数等于列表[(2, 3), (2, 4), (3, 4)]
中组合的元素数。
由于订单组合不重要,您可以在itertools.combinations([1,2,3], 2)=[(1, 2), (1, 3), (2, 3)]
中将1到4映射到[(1, 2), (1, 3), (2, 3)]
。