How to group intersecting Shapely geometric objects in a list of tuples
Keep a dict of objects mapped to A,B and C, a set of matched objects and only add the single elements that have no matches after we get to a new letter if they are not in our matched set as all possible combinations will have been tested:
from shapely.geometry import box
from itertools import combinations
codes = ["A", "B", "C"]
d = dict(zip(codes, data))
prev = codes[0]
matched, out = set(), []
for p1, p2 in combinations(codes, 2):
if d[p1].intersects(d[p2]):
out.append((p1, p2))
matched.update([p1, p2])
# when p1 is a new letter, we have tried all combs for that prev
# if prev is not in matched it did not intersect any other so
# add it as a single tuple and add to matched to avoid dupes
elif p1 != prev and prev not in matched:
out.append(tuple(prev,))
matched.add(prev)
prev = p1
# catch the last letter
if p2 not in matched:
out.append(tuple(p2,))
print(out)
[('A', 'C'), ('B',)]