组合的高效组合

Efficient combinations of combinations

我需要一组长度递增的组合的所有组合。 第一组是这样创建的:

combinations = list(itertools.combinations(5, 2))
[(0, 1), (0, 2), (0, 3), (0, 4), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]

然后,匹配特定条件的所有组合存储在 matches:

[(0, 2), (0, 3), (0, 4), (3, 4)]

其中,我想找到所有长度为 3 的相交组合:

[(0, 3, 4)]

我只需要找到相互交叉的组合。 [(0, 3), (0, 4), (3, 4)]是相交的,所以[(0, 3, 4)]是一个组合。 [(0, 2, 4)] 不是,因为 (2,4) 不相交

目前我正在使用:

 combinations = []
 for y in matches:
      for x in matches:
          if y != x:
             el = qsort(unique(y[:] + x[:]))
             if el not in combinations and len(el) == it:
                  combinations.append(el)

但是处理超过 200 个数字的组合需要很长时间。有没有办法更快地做到这一点?

正如 chepner 所建议的,我正在寻找此图中的所有循环或派系。 Networkx 的 enumerate_all_cliques() 是找到它们的简单方法。