使用Python查找元组中的所有常见元素和组合

时间:2017-07-26 19:50:57

标签: python iteration combinations

我正在尝试将所有值组合在一起,这些值在元组中共享共同元素 - 基本上可以找到任意组合的数字组(无需订单) - 我有元组。例如,如果我有以下一组元组:

(1,2),(1,3),(1,5),(1,6),(2,3),(2,5),(2,7),(3,5),(3,7),(3,9)

我想了解所有共同的元素。对于此示例,这将是:

1, 2, 3, 5  (since I have any combination of 1,2,3 and 5)
2, 3, 7 (since I have any combination of 2,3 and 7)
1, 6 (since I have any combination of 1 and 6)
3, 9 (since I have any combination of 3 and 9)

关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:4)

如@alfasin所述,您正在寻找图表中的最大cliques

  

在无向图中的一个集团C,G =(V,E)是该集合的一个子集   顶点,C⊆V,使每两个不同的顶点相邻。

     

最大集团是一个不能通过包含一个集团来扩展的集团   更邻近的顶点,即不存在的集团   只在较大集团的顶点集合内。

<{3}} NetworkXfind_cliques是你的朋友:

>>> import networkx as nx
>>> G = nx.Graph([(1,2),(1,3),(1,5),(1,6),(2,3),(2,5),(2,7),(3,5),(3,7),(3,9)])
>>> list(nx.find_cliques(G))
[[3, 9], [3, 2, 1, 5], [3, 2, 7], [6, 1]]

如果您想将图表定义为小团队的联合,并查看它们是否合并到较大的团队,您可以使用itertools.combinations迭代输入团体的所有边缘并将其添加到图表中:

import networkx as nx
from itertools import combinations

G = nx.Graph()

cliques = [(1,2,3),(1,2,4),(1,3,4),(2,3,4)]

for clique in cliques:
  for vertices in combinations(clique, r=2):
    G.add_edge(*vertices)

print(list(nx.find_cliques(G)))
# [[1, 2, 3, 4]]