You can use defaultdict to create your own βchartβ from the list of edges / paths:
edges = [['1', '2'], ['2', '4'], ['1', '11'], ['4', '11']] G = defaultdict(list) for (s,t) in edges: G[s].append(t) G[t].append(s) print G.items()
Conclusion:
[
('1', ['2', '11']),
('11', ['1', '4']),
('2', ['1', '4']),
('4', ['2', '11'])
]
Note that I added edges in both directions, since you are working with an undirected graph. So with edge (a, b), G[a] will include b , and G[b] will include a .
From this, you can use an algorithm, such as depth search or breadth-first search , to find all the paths on the chart.
In the following code, I used DFS:
def DFS(G,v,seen=None,path=None): if seen is None: seen = [] if path is None: path = [v] seen.append(v) paths = [] for t in G[v]: if t not in seen: t_path = path + [t] paths.append(tuple(t_path)) paths.extend(DFS(G, t, seen[:], t_path)) return paths
What you can use with:
G = defaultdict(list) for (s,t) in edges: G[s].append(t) G[t].append(s) print DFS(G, '1')
Conclusion:
[('1', '2'), ('1', '2', '4'), ('1', '2', '4', '11'), ('1', '11 '), (' 1 ',' 11 ',' 4 '), (' 1 ',' 11 ',' 4 ',' 2 ')]
So, the complete code with the last bit that shows the longest path:
from collections import defaultdict def DFS(G,v,seen=None,path=None): if seen is None: seen = [] if path is None: path = [v] seen.append(v) paths = [] for t in G[v]: if t not in seen: t_path = path + [t] paths.append(tuple(t_path)) paths.extend(DFS(G, t, seen[:], t_path)) return paths
Conclusion:
All Paths:
[('1', '2'), ('1', '2', '4'), ('1', '2', '4', '11'), ('1', '11 '), (' 1 ',' 11 ',' 4 '), (' 1 ',' 11 ',' 4 ',' 2 ')]
Longest Paths:
('1', '2', '4', '11')
('1', '11', '4', '2')
Longest Path Length:
4
Note. The "starting point" of your search is determined by the second argument to the DFS function, in which case it is '1' .
Update: As discussed in the comments, the above code assumes you have a starting point (in particular, the code uses a node labeled '1' ).
A more general method, if you do not have such a starting point, is to do a search starting at each node and take the longest one. (Note: you could actually be smarter than that)
Row change
all_paths = DFS(G, '1')
to
all_paths = [p for ps in [DFS(G, n) for n in set(G)] for p in ps]
will give you the longest path between any two points.
(This is a silly list comprehension, but it only allows me to update one line. Simply put, this is equivalent to the following:
all_paths = [] for node in set(G.keys()): for path in DFS(G, node): all_paths.append(path)
or
from itertools import chain all_paths = list(chain.from_iterable(DFS(G, n) for n in set(G)))
)