Вы можете использовать пересечение наборов, чтобы проверить, есть ли какое-либо общее значение между двумя наборами, и вы можете использовать объединение наборов, чтобы объединить два набора:
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}]
Затем вы можете преобразовать его в нужный список отсортированных кортежей, если хотите:
b = [tuple(sorted(s)) for s in b]
b
становится:
[(1, 2, 3), (4, 5), (6, 7, 8)]