The specified pairs of form elements [(a,b),...], where (a,b)means a > b, for example:
[('best','better'),('best','good'),('better','good')]
I would like to list the form:
['best','better','good']
This is very difficult for some reason. Any thoughts?
========================== code ========================= ==================================================== ==
I know why this is not working.
def to_rank(raw):
rank = []
for u,v in raw:
if u in rank and v in rank:
pass
elif u not in rank and v not in rank:
rank = insert_front (u,v,rank)
rank = insert_behind(v,u,rank)
elif u in rank and v not in rank:
rank = insert_behind(v,u,rank)
elif u not in rank and v in rank:
rank = insert_front(u,v,rank)
return [[r] for r in rank]
def insert_front(u,v,words):
if words == []: return [u]
else:
head = words[0]
tail = words[1:]
if head == v: return [u] + words
else : return ([head] + insert_front(u,v,tail))
def insert_behind(u,v,words):
words.reverse()
words = insert_front(u,v,words)
words.reverse()
return words
==================== Update ====================
According to many, this is a straightforward topological sorting, I eventually decided to use the code from this source: algocoding.wordpress.com/2015/04/05/topological-sorting-python/
who solved my problem.
def go_topsort(graph):
in_degree = { u : 0 for u in graph }
for u in graph:
for v in graph[u]:
in_degree[v] += 1
Q = deque()
for u in in_degree:
if in_degree[u] == 0:
Q.appendleft(u)
L = []
while Q:
u = Q.pop()
L.append(u)
for v in graph[u]:
in_degree[v] -= 1
if in_degree[v] == 0:
Q.appendleft(v)
if len(L) == len(graph):
return L
else:
return []
RockBilly , v < u, (u,v) . "", .