My solution (using some code from @unutbu)
import collections retval = [] data = [[1,2,3], [4,5,6], [2, 5], [3, 6], [1, 7]] in_edges = collections.defaultdict(set) out_edges = collections.defaultdict(set) vertices = set() for row in data: vertices |= set(row) while len(row) >= 2: w = row.pop() v = row[-1] in_edges[w].add(v) out_edges[v].add(w) def process(k): vertices.remove(k) retval.append(k) for target in out_edges[k]: in_edges[target].remove(k) for target in out_edges[k]: if not in_edges[target]: process(target) out_edges[k] = set() while vertices:
source share