Python 基于公共值将列表合并在一起

Python 基于公共值将列表合并在一起,python,python-3.x,list,Python,Python 3.x,List,我有一张单子 a = [(1,2),(1,3),(4,5),(6,7),(8,7)] 我想将列表中的值合并到组中,以便获得: b = [(1,2,3),(4,5),(6,7,8)] 顺序并不重要,但基于连通性的组很重要。我还没能想出一个方法来做这件事,任何帮助都是感激的 可以使用“集合交集”来测试两个集合之间是否有任何共同值,也可以使用“集合并集”来合并两个集合: b = [] for p in map(set, a): for i, s in enumerate(b):

我有一张单子

a = [(1,2),(1,3),(4,5),(6,7),(8,7)]
我想将列表中的值合并到组中,以便获得:

b = [(1,2,3),(4,5),(6,7,8)]

顺序并不重要,但基于连通性的组很重要。我还没能想出一个方法来做这件事,任何帮助都是感激的

可以使用“集合交集”来测试两个集合之间是否有任何共同值,也可以使用“集合并集”来合并两个集合:

b = []
for p in map(set, a):
    for i, s in enumerate(b):
        if s & p:
            b[i] |= p
            break
    else:
        b.append(p)
b
变成:

[{1, 2, 3}, {4, 5}, {8, 6, 7}]
[(1, 2, 3), (4, 5), (6, 7, 8)]
然后,如果需要,可以将其转换为所需的已排序元组列表:

b = [tuple(sorted(s)) for s in b]
b
变成:

[{1, 2, 3}, {4, 5}, {8, 6, 7}]
[(1, 2, 3), (4, 5), (6, 7, 8)]

一些for循环将完成此工作:

a = [(1,2),(1,3),(4,5),(6,7),(8,7)]

unions = [[i1,i2]  for i1,x in enumerate(a) for i2,y in enumerate(a) for z in x if z in y and i2!=i1]

for c in unions:
    if c[::-1] in unions: unions.remove(c[::-1])

b = [e for i,e in enumerate(a) if i not in [y for x in unions for y in x]]

for c in unions:b.append(tuple(set(a[c[0]]+a[c[1]])))

print sorted(b)