Вы можете сделать это, не глядя на все перестановки. Начните с последнего элемента и создайте словарь, где ключи являются первым значением в словаре. Затем работайте в обратном направлении по списку и ищите предыдущий ключ, основываясь на втором значении кортежа, добавляемом в массив, когда вы go:
. В конце вы получите словарь, ключ к первому значению которого кортежи из первого списка. Вы можете просто сгладить значения в этой точке.
Здесь я добавил еще одну пару [12,9]
в средний список, чтобы видеть, как она работает с путями ветвления:
from collections import defaultdict
from itertools import chain
l = [
[[7, 12], [6, 12], [38, 44], [25, 30]],
[[0, 5], [1, 5], [2, 5], [12, 16], [12, 9],[13, 16], [20, 23], [29, 33], [30, 33]],
[[5, 7], [6, 8], [7, 9], [8, 10], [9, 11], [10, 12], [16, 18], [17, 19], [18, 20], [23, 25], [24, 26], [25, 27], [26, 28], [27, 29], [33, 35], [34, 36], [35, 37], [36, 38], [37, 39], [38, 40], [39, 41], [40, 42], [41, 43], [42, 44]]
]
d = defaultdict(list)
for k, v in l[-1]:
d[k].append([[k,v]])
for sub in reversed(l[:-1]):
ds = defaultdict(list)
for k, v in sub:
if v in d:
ds[k].extend([[k,v], *v2] for v2 in d[v] )
d = ds
list(chain.from_iterable(d.values()))
Вывод:
[[[7, 12], [12, 16], [16, 18]],
[[7, 12], [12, 9], [9, 11]],
[[6, 12], [12, 16], [16, 18]],
[[6, 12], [12, 9], [9, 11]],
[[25, 30], [30, 33], [33, 35]]]