2016-12-26 67 views
0

我有这样合并元组以形成共同的元组

l = [('hin1','ie2',2),('hin1','ie3',2),('hin4','ie5',2),('hin6','ie22',2),('hin1','ie32',2),('hin31','ie2',2),('hin61','ie62',2)] 

我要合并共享两个

因此之间ATLEAST一个共同的元件的元组的元组的列表 - 两个元这样的:

('hin1','ie2',2),('hin1','ie3',2) should result in 
(('hin1','ie2', 'ie3') 

对于上述列表L,我最后的输出应该是这样的

output - [(hin1,ie2,ie3,ie32,hin31),(hin4,ie5),(hin6,ie22),(hin61,ie62)] 

注 - 每个元组的第3个元素可以忽略

任何起点?

回答

2

这是一个网络分析问题。如果您不打算编写自己的算法来解决此问题,则可以使用igraph包:

import igraph 
​ 
# build the graph object 
g = igraph.Graph() 
edges, vertices = set(), set() 
for e in l: 
    vertices.update(e[:2]) 
    edges.add(e[:2]) 

g.add_vertices(list(vertices)) 
g.add_edges(list(edges)) 
​ 
# decompose the graph into sub graphs based on vertices connection 
[[v['name'] for v in sg.vs()] for sg in g.decompose(mode="weak")] 

#[['ie2', 'hin1', 'ie32', 'hin31', 'ie3'], 
# ['hin6', 'ie22'], 
# ['hin61', 'ie62'], 
# ['hin4', 'ie5']] 
1

我已经写了一个在这里开始,而不是整个功能。但看看这种方法,我认为你可以从中推断出来。当只有2的重叠时,它返回正确的输出,它满足除了具有4个不同重叠的'hin1'之外的所有选项。如果你重复一般概念并稍微调整一下,我想你可以弄明白!

tuples_list = [('hin1','ie2',2),('hin1','ie3',2),('hin4','ie5',2),('hin6','ie22',2),('hin1','ie32',2),('hin31','ie2',2),('hin61','ie62',2)] 

for tuple in tuples_list: 
    for tup in tuples_list: 
     if tuple[0] == tup[0]: 
      new_tup = (tuple[0],tuple[1],tup[1]) 
      print new_tup 

这将返回该列表:

('hin1', 'ie2', 'ie2') 
('hin1', 'ie2', 'ie3') 
('hin1', 'ie2', 'ie32') 
('hin1', 'ie3', 'ie2') 
('hin1', 'ie3', 'ie3') 
('hin1', 'ie3', 'ie32') 
('hin4', 'ie5', 'ie5') 
('hin6', 'ie22', 'ie22') 
('hin1', 'ie32', 'ie2') 
('hin1', 'ie32', 'ie3') 
('hin1', 'ie32', 'ie32') 
('hin31', 'ie2', 'ie2') 
('hin61', 'ie62', 'ie62') 

然后你就可以作为输入使用你的第二个走通。这只是一种方法。我确信有更优雅的解决方案,但我希望这对你来说是一个体面的开始!