Python 迭代时是否从itertools.compositions中删除元素? 给出一个列表 L>代码>,列表元素的所有组合都可以在遍历所有组合的同时删除包含“代码> x/CODE >的任何组合,这样,在删除后,在迭代中,你永远不会考虑包含 x 的组合吗? for a, b in itertools.combinations(l, 2): if some_function(a,b): remove_any_tup_with_a_or_b(a, b)

Python 迭代时是否从itertools.compositions中删除元素? 给出一个列表 L>代码>,列表元素的所有组合都可以在遍历所有组合的同时删除包含“代码> x/CODE >的任何组合,这样,在删除后,在迭代中,你永远不会考虑包含 x 的组合吗? for a, b in itertools.combinations(l, 2): if some_function(a,b): remove_any_tup_with_a_or_b(a, b),python,iterator,combinations,Python,Iterator,Combinations,我的列表l相当大,因此我不想将这些组合保存在内存中。实现这一点的一个廉价技巧是通过使用动态更新的排除值集进行不相交测试进行过滤,但它实际上不会避免生成您希望排除的组合,因此,这并不是一个主要的性能优势(尽管如果检查continue语句(通常是将过滤器工作推到C层),使用C内置函数(如isdisjoint)进行过滤将比Python级别的更快): 如果您想从组合列表中删除包含代码< >代码> x>代码>的所有元组>组合(L,2),请考虑您从集合迭代器中有一对一映射(数学上讲)。(i(i,in in(

我的列表
l
相当大,因此我不想将这些组合保存在内存中。

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


如果您想从组合列表中删除包含代码< >代码> x>代码>的所有元组>组合(L,2),请考虑您从集合<代码>迭代器中有一对一映射(数学上讲)。(i(i,in in(1,LeN(L)),2)<代码> > <代码>迭代器。组合(L,2)

不包含数字
x

示例:

itertools中所有组合的集合。不包含数字1的组合([1,2,3,4],2)
[(2,3)、(2,4)、(3,4)]
给出。请注意,此列表中的元素数等于列表
itertools.combines([1,2,3],2)=[(1,2)、(1,3)、(2,3)]


由于顺序在组合中并不重要,您可以在
[(1,2)、(1,3)、(2,3)]
中将1映射到4,以获得
[(1,2)、(1,3)、(2,3)]=[(4,2)、(4,3)、(2,3)]=[(2,4)、(3,4)、(2,3)]=[(2,3)、(2,4)、(3,4)]
@PM2Ring我认为关于“我不想把组合保存在内存中”的评论他说,创建所有组合的
列表
(或其他一些数据结构)的简单解决方案并不合适,这样您就可以在确定这些组合后立即从
列表
中删除“坏”组合。大多数了解
itertools
的人都知道生成器是如何工作的(避免前期内存消耗)。@ShadowRanger:哦,好的。
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))