[英]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.