合并具有至少一个公共元素的元组以形成一个公共元组
Merge tuples having atleast one common element to form a common tuple
我有一个这样的元组列表
l = [('hin1','ie2',2),('hin1','ie3',2),('hin4','ie5',2),('hin6','ie22',2),('hin1','ie32',2),('hin31','ie2',2),('hin61','ie62',2)]
我想合并至少有一个公共元素的元组
因此 - 像这样的两个元组:
('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 个元素可以忽略
有什么起点吗?
我在这里写了一个开始,而不是整个函数。但是看看这个方法,我认为你可以从中推断出来。它 returns 当只有 2 的重叠满足所有选项时的正确输出,除了 'hin1' 有 4 个不同的重叠。如果您重复一般概念并稍微调整一下,我想您可以弄明白!
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
这个returns这个列表:
('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')
然后您可以将其用作第二次检查的输入。这只是一种方法。我敢肯定还有更优雅的解决方案,但我希望这对您来说是一个不错的开始!
这是一道网络分析题。如果您不打算自己编写算法来解决它,可以使用 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']]
我有一个这样的元组列表
l = [('hin1','ie2',2),('hin1','ie3',2),('hin4','ie5',2),('hin6','ie22',2),('hin1','ie32',2),('hin31','ie2',2),('hin61','ie62',2)]
我想合并至少有一个公共元素的元组
因此 - 像这样的两个元组:
('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 个元素可以忽略
有什么起点吗?
我在这里写了一个开始,而不是整个函数。但是看看这个方法,我认为你可以从中推断出来。它 returns 当只有 2 的重叠满足所有选项时的正确输出,除了 'hin1' 有 4 个不同的重叠。如果您重复一般概念并稍微调整一下,我想您可以弄明白!
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
这个returns这个列表:
('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')
然后您可以将其用作第二次检查的输入。这只是一种方法。我敢肯定还有更优雅的解决方案,但我希望这对您来说是一个不错的开始!
这是一道网络分析题。如果您不打算自己编写算法来解决它,可以使用 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']]