我喜欢从双列表中消除重复的组件,然后组合双列表



我需要你的帮助来解决这个问题。

当我使用这段代码时,我可以得到这个结果。

输入=[[1],[1,2],[5,7]]

输出=[[1,2],[5,7]]

Tb2 = Tb[:1] 
for t in Tb[1:]: 
if set(t).isdisjoint(Tb2[-1]):
Tb2.append(t)
else:
Tb2[-1] = sorted({*t,*Tb2[-1]})

但是当另一个列表输入相同的数字时,我无法解决这个问题。

输入=[[2,3],[1,2],[5,7],[5,8],[7,8,9],[1]]

期望输出=[[1,2,3],[5,7,8,9]]

你能给我建议或帮助吗?

这似乎是图论中的连接组件问题,所以你可以使用networkx来解决它:

import networkx as nx
from itertools import combinations
# input
lst = [[2, 3], [1, 2], [5, 7], [5, 8], [7, 8, 9], [1]]
# build graph
g = nx.Graph()
g.add_edges_from([edge for ls in lst for edge in combinations(ls, 2)])
# compute components
components = nx.algorithms.components.connected_components(g)
res = list(components)
print(res)

[{1, 2, 3}, {8, 9, 5, 7}]
这个想法是在同一列表的每对元素之间建立一条边,这是通过以下列表推导实现的:
[edge for ls in lst for edge in combinations(ls, 2)]
# [(2, 3), (1, 2), (5, 7), (5, 8), (7, 8), (7, 9), (8, 9)]

一旦完成,只需在图上运行connected_components算法。

for t in Tb:
for j in range(len(Tb2)):
if set(t).isdisjoint(Tb2[j]):
Tb2.append(t)
else:
Tb2[j] = sorted({*t,*Tb2[j]})

输出=[(1、2、3),(5、7、8、9),(5、7、8、9)[7 8 9],[1],[1],[1]]

我不能消除相同大小的双表。

最新更新