我建议将所有步骤放入它导致的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