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)