python合并list中含有至少一个相同元素的子list

背景

最近在计算商品的聚合, 其中,需要将间接关联的商品合并在一起。如: 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快太多!

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值