该函数以字典为输入,并需要找到字典中最长路径的长度。基本上,如果在字典中,key2与value1匹配,key3与value2匹配,以此类推,这就是一条路径。例如:
{'a':'b', 'b':'c', 'c':'d'}
在上面的情况下,长度应该是三。我该如何实现这一点?或者更具体地说,我该如何比较键和值?(可以是任何东西,字符串、数字等,不仅仅是数字)
非常感谢您的帮助!
该函数以字典为输入,并需要找到字典中最长路径的长度。基本上,如果在字典中,key2与value1匹配,key3与value2匹配,以此类推,这就是一条路径。例如:
{'a':'b', 'b':'c', 'c':'d'}
我会把字典视为有向无环图(DAG)中的边列表,并使用networkx
模块来查找图中最长的路径:
import networkx as nx
data = {'a':'b', 'b':'c', 'c':'d'}
G = nx.DiGraph()
G.add_edges_from(data.items())
try:
path = nx.dag_longest_path(G)
print(path)
# ['a', 'b', 'c', 'd']
print(len(path) - 1)
# 3
except nx.exception.NetworkXUnfeasible: # There's a loop!
print("The graph has a cycle")
networkx
的功能。 - DYZnetworkx
版本现在也支持加权边 :) - mathandydef find_longest_path(data):
longest = 0
for key in data.iterkeys():
seen = set()
length = -1
while key:
if key in seen:
length = -1
raise RuntimeError('Graph has loop')
seen.add(key)
key = data.get(key, False)
length += 1
if length > longest:
longest = length
return longest
raise RuntimeError('Graph has loop')
会使 length=-1
和 break
变得不必要。 - DYZRuntimeError
。 - Batman
{'a':'b', 'b':'c', 'c':'d', 'd' : 'a'}
? - DYZ