将具有共同元素的子列表分组

时间:2019-05-10 09:10:40

标签: python list networkx

我正在努力处理一些可能并不复杂的事情。我有一个列表列表,如果它们共享任何公共元素,我想将它们分组在一起:

enter image description here

例如,第一个列表[1,2]与第三个列表[3,4]分组在一起,因为它们在第二个列表[2,3]之间“重叠”了

肯定有比以下更简单的方法

a = [[1,2],
     [2,3],
     [3,4],
     [7,8]]

newlist = []
for count, pair in enumerate(a):
    if count==0:
        newlist.append(pair)
    else:
        for index, group in enumerate(newlist):
            if not set(group).isdisjoint(pair):
                newlist[index].extend(pair)
            else:
                newlist.append(pair)

newlist = [set(group) for group in newlist]

newlist
[{1, 2, 3, 4}, {8, 7}]

1 个答案:

答案 0 :(得分:2)

类似于this帖子,一种解决方法是使用networkx。生成图形,并使用add_edges_from将列表添加为图形边缘。然后使用connected_components,它将为您提供图形中一组已连接组件的列表:

L = [[1,2],
     [2,3],
     [3,4],
     [7,8]]

import networkx as nx

G=nx.Graph()
G.add_edges_from(L)
newlist  = list(nx.connected_components(G))

print(new_list)
# [{1, 2, 3, 4}, {7, 8}]