给出形式[(a,b),……]的项目对,其中(a,b)表示a> 1. b,例如:
[('best','better'),('best','good'),('better','good')]
我想输出一个表单列表:
['best','better','good']
由于某种原因,这很难.有什么想法吗?
========================代码========================= ====
我知道为什么它不起作用.
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]
# @Use: insert word u infront of word v in list of words
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))
# @Use: insert word u behind word v in list of words
def insert_behind(u,v,words):
words.reverse()
words = insert_front(u,v,words)
words.reverse()
return words
===================更新===================
根据许多人的建议,这是一个直接的拓扑排序设置,我最终决定使用此源代码:algocoding.wordpress.com/2015/04/05/topological-sorting-python/
这解决了我的问题.
def go_topsort(graph):
in_degree = { u : 0 for u in graph } # determine in-degree
for u in graph: # of each node
for v in graph[u]:
in_degree[v] += 1
Q = deque() # collect nodes with zero in-degree
for u in in_degree:
if in_degree[u] == 0:
Q.appendleft(u)
L = [] # list for order of nodes
while Q:
u = Q.pop() # choose node of zero in-degree
L.append(u) # and 'remove' it from graph
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: # if there is a cycle,
return []
RockBilly的解决方案也适用于我的情况,因为在我的环境中,每个v
最佳答案 您正在寻找的是
topological sort.您可以使用深度优先搜索(我链接的wiki中包含的伪代码)在线性时间内执行此操作