我喜欢从双重列表中消除重复的组件,然后合并双重列表
Posted
技术标签:
【中文标题】我喜欢从双重列表中消除重复的组件,然后合并双重列表【英文标题】:I like to eliminate duplicate components from double list, and then combine the double lists 【发布时间】:2021-12-13 02:32:45 【问题描述】:我需要你的帮助来解决这个问题。
当我使用这段代码时,我可以得到这个结果。
输入=[[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]]
你会给我建议或帮助吗?
【问题讨论】:
可以使用stack
数据结构
顺便说一句 input=[[2,3],[1,2],[5,7],[5,8],[7,8,9],[7, 1]]
的输出是什么?是[[1,2,3,5,7,8,9]]
吗?
是的,每个组件都是相关的。
【参考方案1】:
这看起来像是图论中的connected components problem,所以你可以使用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
算法即可。
【讨论】:
这个方法很有趣,我之前没用过networkx。【参考方案2】: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]]
我无法消除相同且小尺寸的双重列表。
【讨论】:
以上是关于我喜欢从双重列表中消除重复的组件,然后合并双重列表的主要内容,如果未能解决你的问题,请参考以下文章