【发布时间】:2018-11-05 08:46:15
【问题描述】:
我有一个列表列表,其中每个子列表都包含一些整数:
o = [[1,2],[3,4],[2,3],[5,4]]
我想创建一个新的列表列表,其中o 中任何两个共享一个共同成员的子列表将被合并。这个合并过程应该一直持续到没有两个子列表共享一个公共元素。给定o,我们会将[1,2] 与[2,3] 合并,因为它们共享一个2,然后我们将该组与[3,4] 合并,因为[1,2,3] 和[3,4] 都包含一个3,依此类推。
聚类o 的预期输出为[[1,2,3,4,5]]
我有一种预感,有一种方法可以完成这项任务,它远远优于我目前的方法(见下文)。其他人可以就完成此任务的最有效(时间,然后是空间)方式提供任何建议,我们将不胜感激。
from collections import defaultdict
o = [[1,2],[3,4],[2,3],[5,4]]
def group_lists(list_of_lists):
'''
Given a list of lists, continue combining sublist
elements that share an element until no two sublist
items share an element.
'''
to_cluster = set(tuple(i) for i in list_of_lists)
keep_clustering = True
while keep_clustering:
keep_clustering = False
d = defaultdict(set)
for i in to_cluster:
for j in i:
d[j].add(i)
clustered = set()
for i in d.values():
# remove duplicate entries from each cluster
flat = tuple(set([item for sublist in i for item in sublist]))
clustered.add(flat)
if not to_cluster == clustered:
keep_clustering = True
to_cluster = clustered
# done clustering!
return clustered
print(group_lists(o))
【问题讨论】: