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

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]]

我无法消除相同且小尺寸的双重列表。

【讨论】:

以上是关于我喜欢从双重列表中消除重复的组件,然后合并双重列表的主要内容,如果未能解决你的问题,请参考以下文章

列表理解中的双重迭代

禁用双重选择似乎不起作用?

双重链接列表类中的迭代器

从向量中擦除对象会导致双重释放[重复]

Django告诉双重排序中具有特定属性的最后一项(order_by)

在对列表进行双重递归时,“预检查”是避免添加无类型或空字符串的首选方法吗?