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

最佳答案

实现此目的的一个便宜技巧是使用动态更新的排除值set通过不相交测试进行过滤,但实际上并不能避免生成您希望排除的组合,因此这并不是主要的性能优势(尽管filter工作推送到C层,使用像isdisjoint这样的C内置函数通常比使用if语句的Python级别continue检查要快):

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))

关于python - 在迭代时从itertools.combinations中删除元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39240242/

10-14 05:21