如何基于共享项有效地分组对?

我有一个对(元组)列表,为简化这样的事情:

L = [("A","B"),("B","C"),("C","D"),("E","F"),("G","H"),("H","I"),"J")]

使用python我想有效地将​​此列表拆分为:

L1 = [("A","D")]
L2 = [("E","F")]
L3 = [("G","J"),"I")]

如何有效地将列表拆分为成对的组,对于组中的对,必须始终至少有一对与其他对共享一个项目?如其中一个答案中所述,这实际上是网络问题.目标是有效地将网络分成不连续(隔离)的网络部分.

可以更改类型列表,元组(集合)以实现更高的效率.

解决方法

这更像是一个网络问题,所以我们使用网络

import networkx as nx
G=nx.from_edgelist(L)

l=list(nx.connected_components(G))
# after that we create the map dict,for get the unique id for each nodes
mapdict={z:x for x,y in enumerate(l) for z in y }
# then append the id back to original data for groupby 
newlist=[ x+(mapdict[x[0]],)for  x in L]
import itertools
#using groupby make the same id into one sublist
newlist=sorted(newlist,key=lambda x : x[2])
yourlist=[list(y) for x,y in itertools.groupby(newlist,key=lambda x : x[2])]
yourlist
[[('A','B',0),('B','C',('C','D',0)],[('E','F',1)],[('G','H',2),('H','I',('G','J',2)]]

匹配您的输出

L1,L2,L3=[[y[:2]for y in x] for x in yourlist]
L1
[('A','B'),'C'),'D')]
L2
[('E','F')]
L3
[('G','H'),'I'),'J')]

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...