簡體   English   中英

合並具有至少一個公共元素的元組以形成一個公共元組

[英]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)]

注意-每個元組的第三個元素都可以忽略

有任何起點嗎?

這是一個網絡分析問題。 如果您不想編寫自己的算法來解決它,則可以使用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']]

我在這里寫了一個開始,而不是整個功能。 但是看看這種方法,我認為您可以從中推論得出。 當只有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

這將返回以下列表:

('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')

然后可以將其用作第二遍的輸入。 這只是一種方法。 我敢肯定還有更好的解決方案,但我希望這對您來說是一個不錯的開始!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM