Вы можете использовать рекурсию с генератором:
def get_groups(start, data, _seen=[], _current=[]):
vals = set(filter(lambda x:x not in _seen, [b for a, b in data if a == start] + [a for a, b in data if b == start]))
if not vals:
yield _current
data = [(a, b) for a, b in data if a not in _seen and b not in _seen]
if data:
c, d = data[0][0], data[0][-1]
yield from get_groups(c, data, _seen=_seen+[c, d], _current=[c, d])
yield from get_groups(d, data, _seen=_seen+[c, d], _current=[c, d])
else:
for i in vals:
if i not in _seen:
yield from get_groups(i, data, _seen=_seen+[i], _current=_current+[i])
list_a = [('42', '43'), ('43', '46'), ('44', '45'), ('45', '46'), ('47', '48'), ('48', '51'), ('49', '50'), ('50', '51')]
def get_result(l):
result = sorted(list(get_groups(l[0][0], l, _seen=[l[0][0]], _current=[l[0][0]])), key=len, reverse=True)
return [a for i, a in enumerate(result) if all(any(c not in b for c in a) for b in result[:i])]
print(get_result(list_a))
Выход:
[['42', '43', '46', '45', '44'], ['47', '48', '51', '50', '49']]