在迭代时从itertools.combinations中删除元素?

时间:2016-08-31 03:25:12

标签: python iterator combinations

给定列表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非常大,所以我不想将这些组合保留在内存中。

2 个答案:

答案 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)]