繁体   English   中英

如何有效地找到两个列表之间的公共部分

[英]How to efficiently find the common part between two lists

有两个列表,分别表示聚类算法的两个结果,如com1 = [[1,2,3,4], [5, 6, 7, 8], [9]],其中com1表示一个聚类结果,[1,2,3,4]表示节点1,2,3,4属于同一类。 [5,6,7,8]表示节点5,6,7,8属于同一类,9属于不同的类。 com2 = [[1, 2, 4], [3], [5, 6, 7, 8], [9]]。 现在,我需要找出 com1 和 com2 之间的公共部分,例如 [1,2,4]、[5,6,7,8]、[9]。

有解决这个问题的有效方法吗?

假设给定值只能出现在com1的一个子列表和com2的一个子列表中,我们可以观察到以下情况:

当两个值属于com1中的同一个子列表并且也属于com2中的同一个子列表时,它们将属于结果中的同一个子列表。

因此,我们可以为每个值收集它们所属的子列表的两个索引:一个索引标识com1中的子列表,另一个标识com2中的子列表。

我们可以使用这些对作为唯一标识目标子列表的,并相应地填充这些子列表:

from collections import defaultdict

def combine(com1, com2):
    d = defaultdict(list)
    for com in com1, com2:
        for i, lst in enumerate(com):
            for val in lst:
                d[val].append(i)
    res = defaultdict(list)
    for val, key in d.items():
        res[tuple(key)].append(val)
    return list(res.values())

# Example 1
com1 = [[1,2,3,4], [5, 6, 7, 8], [9]]
com2 = [[1, 2, 4], [3], [5, 6, 7, 8], [9]]
print(combine(com1, com2))  # [[1, 2, 4], [3], [5, 6, 7, 8], [9]]

# Example 2
com1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
com2 = [[1, 9], [2, 3, 4], [5, 6, 7, 8], [9]]
print(combine(com1, com2))  # [[1], [2, 3], [4], [5, 6], [7, 8], [9]]

如果我们假设字典获取/设置操作的分摊常数时间复杂度,那么这会将总时间复杂度带到 O(),其中表示列表中被分区的值的数量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM