Я бы посоветовал поместить все шаги в словарь key -> list of keys
, к которому они приводят.
Вы можете запросить это, чтобы получить все триплеты:
data = ['A to B', 'B to C', 'C to D', 'D to E', 'A to C', 'A to D', 'A to E',
'B to A', 'B to C', 'B to D', 'B to E', 'C to A', 'E to B', 'E to C', 'E to A']
from collections import defaultdict
routes = defaultdict(list)
for d in data:
frm, to = d.split(" to ")
routes[frm].append(to)
print (routes)
plets = set()
for frm, to in routes.items():
for target in to:
for target2 in routes[target]:
if frm in routes[target2]:
plets.add( (frm, target, target2, frm) )
for t in sorted(plets):
print(*t, sep= " -> ")
Вывод:
defaultdict(<class 'list'>, {'A': ['B', 'C', 'D', 'E'],
'B': ['C', 'A', 'C', 'D', 'E'],
'C': ['D', 'A'],
'D': ['E'],
'E': ['B', 'C', 'A']})
A -> B -> C -> A
A -> B -> E -> A
A -> D -> E -> A
A -> E -> B -> A
A -> E -> C -> A
B -> A -> E -> B
B -> C -> A -> B
B -> D -> E -> B
B -> E -> A -> B
C -> A -> B -> C
C -> A -> E -> C
C -> D -> E -> C
D -> E -> A -> D
D -> E -> B -> D
D -> E -> C -> D
E -> A -> B -> E
E -> A -> D -> E
E -> B -> A -> E
E -> B -> D -> E
E -> C -> A -> E
E -> C -> D -> E
Использование набора для хранения ваших возможных маршрутов позволяет избежать повторения одних и тех же маршрутов несколько раз .
Редактировать для вывода:
def formIt(a,b,c,d):
return f"{a} to {b}",f"{b} to {c}",f"{c} to {d}"
for frm, to in routes.items():
for target in to:
for target2 in routes[target]:
if frm in routes[target2]:
plets.add( formIt(frm, target, target2, frm) )
for t in sorted(plets):
print(*t, sep = ", ")
, чтобы получить
A to B, B to C, C to A
A to B, B to E, E to A
A to D, D to E, E to A
... snipp...
E to C, C to A, A to E
E to C, C to D, D to E