【问题标题】:Merging sublists based on content overlap, python 3基于内容重叠合并子列表,python 3
【发布时间】:2017-04-15 01:21:15
【问题描述】:

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

例如: 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 个条目。 有没有办法在没有两个嵌套循环的情况下完成这个?这就是我目前正在做的事情。

【问题讨论】:

  • 当每个元素是一对包含在不同的列表中时会发生什么? IE:[[1,2], [3,4], [1,3]],这会导致[[1,2,3], [3,4]][[1,2], [1,3,4]][[1,2,3], [1,3,4]]
  • 取值范围是多少?
  • 每对中的位数可以与对的总数一样高,因此位数
  • 目前。当我收到它们时,所有的对都存储在一个完整的列表中。但如果有充分的理由,我也可以以不同的方式处理输入。例如,我知道双端队列更快,但可以对它们执行的操作更加有限。

标签: python algorithm list array-merge


【解决方案1】:

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

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

【讨论】:

  • 感谢您的评论!我以前缺乏足够的语言来充分描述我的问题。我真的不知道这是图论。这不是我以前探索过的领域,但现在我知道从哪里开始,我可以做一些阅读来找出我的问题。当我找到解决方案时,我会在这里发帖。干杯
猜你喜欢
  • 1970-01-01
  • 2011-01-31
  • 2019-01-21
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
相关资源
最近更新 更多