背景
最近在计算商品的聚合, 其中,需要将间接关联的商品合并在一起。如: A与B 相似, B与C相似, 按照业务规则, A,B,C应该放到一起。即
通过 [ [A,B] , [B, C] ] 得到 [ [ A, B, C ] ]。
问题
合并list中含有至少一个相同元素的子list。 例子:
原list: [ [1,2,3], [2,4,6], [7,8], [8,9,10] ]
需要得到的新list为: [ [1,2,3,4,6], [7,8,9,10] ]
解决方法
方法1:
from itertools import combinations
def merge_list(list1):
list2 = list1.copy()
for x, y in combinations(list2, 2):
if not set(x).isdisjoint(y):
x += y
if y in list2:
list2.remove(y)
list2 = [sorted(set(x)) for x in list2]
return list2
方法2:
import networkx as nx
def merge_groups(list2):
G = nx.Graph()
G.add_nodes_from(sum( list2, []))
q = [[(s[i],s[i+1]) for i in range(len(s)-1)] for s in list2]
for i in q:
G.add_edges_from(i)
return [list(i) for i in nx.connected_components(G)]
说明: 数据量大的时候, 方法2明显比方法1快太多!