Извините, я не Python разработчик. Ниже -- моё решение в лоб, которое возможно натолкнет на думы об оптимизации. :)
def join_intersections(aSet):
aSetCopy = aSet.copy()
for l, r in [[l,r] for l in changeset for r in changeset]:
if not l.isdisjoint(r) and l != r:
aSetCopy.discard(l)
aSetCopy.discard(r)
yield l | r
for rest in aSetCopy:
yield rest
>>> target_changeset = set(join_intersections(changeset))
>>> target_changeset
set([frozenset([136, 111]), frozenset([105, 101, 102]), frozenset([110, 135]), frozenset([103, 104, 106, 107, 109])])