合并具有至少一个共同元素的元组以形成共同元组

时间:2016-12-26 15:01:29

标签: python python-2.7 list tuples python-2.6

我有一个像这样的元组列表

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

我想合并在两个

之间共享至少一个共同元素的元组

因此 - 这样的两个元组:

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

对于上面的列表l,我的最终输出应该是这样的

 time = Time.at(params[:last_created].to_i)

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

任何起点?

2 个答案:

答案 0 :(得分: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 :(得分: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')

然后您可以将其用作第二次浏览的输入。这只是一种方法。我确信那里有更优雅的解决方案,但我希望这对你来说是个不错的开始!