基于内容重叠合并子列表,python 3

时间:2017-04-15 01:21:16

标签: python algorithm list array-merge

如果我们有许多列表包含其中包含整数的子列表(对)。如果任何两个子列表具有相同的数字,我们希望合并它们并擦除重复的数字。

例如: alist = [[2, 1], [5, 3], [5, 1], [3, 4], [3, 1], [5, 4], [4, 1], [5, 2], [4, 2]] becomes alist = [1,2,3,4,5] 结果将是所有这些都合并到一个列表中,因为它们恰好是共同的所有共享数字。

但并非所有列表都会如此方便:     alist = [[4,5],[7,8],[6,7],[9,5]]     会成为:alist = [[4,5,9],[6,7,8]] 问题是我在巨大的列表上进行迭代,其中包含10 ^ 7个条目。 有没有一个方法来完成这个没有两个嵌套循环?这就是我目前正在做的事情。

1 个答案:

答案 0 :(得分:1)

首先,您可以通过创建一个由数字索引的哈希表来识别哪些对共享成员,这些哈希表的条目是对的集合。

您现在可以将问题视为在图表中查找连接的组件(https://en.wikipedia.org/wiki/Connected_component_%28graph_theory%29),其中节点是成对的,如果它们共享一个数字则连接两对。正如维基百科条目所述,您可以通过使用深度优先搜索来访问图中的所有节点,使用深度优先搜索来跟踪从节点到所有其他节点的所有直接和间接链接。相同的组件。另一种方法是使用https://en.wikipedia.org/wiki/Disjoint-set_data_structure来维护成对的集合,当先前不同的集合中的两对共享一个数字时合并集合。