【发布时间】:2015-05-27 07:28:15
【问题描述】:
所以我正在实施一种算法来从图中修剪叶节点,然后再进行更繁重的计算以在该图中找到循环。我将图表示为邻接表,我将使用的示例是对应于甲苯中碳的图:
[[0, 1], [0, 2], [1, 3], [2, 4], [3, 5], [4, 5], [5, 6]]
我想删除与连接叶节点的边对应的条目,因此需要“修剪”边 [5,6] 以生成这个新的邻接列表:
[[0, 1], [0, 2], [1, 3], [2, 4], [3, 5], [4, 5]]
下面的代码 (Python 3.4) 似乎可以正确执行此操作,因为当我在函数中打印邻接列表时,输出是正确的。但是,当我调用该函数并打印返回的“值”时,它始终是None。
def prune_adj_list(adj_list):
print(adj_list)
all_indices = []
for bond in adj_list:
all_indices = all_indices + bond
leaf_nodes = []
for value in range(min(all_indices),max(all_indices)+1):
if all_indices.count(value) == 1: #count how many bonds to node
leaf_nodes.append(value)
if len(leaf_nodes) == 0: # no leaf nodes so done
print("done pruning")
print(adj_list) #<- the value here is correct
return adj_list
else:
new_adj_list = []
for bond in adj_list:
if not (leaf_nodes.count(bond[0]) > 0 or leaf_nodes.count(bond[1]) > 0):
new_adj_list.append(bond)
if len(new_adj_list) > 0:
prune_adj_list(new_adj_list)
else:
print("pruned away entire graph")
return []
这是一个打印“无”而不是正确值的调用示例。
def find_cycles(compound):
adj_list = make_adj_list(compound) # this produces the list: [[0, 1], [0, 2], [1, 3], [2, 4], [3, 5], [4, 5], [5, 6]]
print(adj_list)
print(prune_adj_list(adj_list))
有人可以向我解释为什么返回值不正确,但是当我在返回之前打印它时它是正确的?还有关于如何解决这个问题的任何建议?我玩过返回 adj_list 的副本,并测试了代码似乎正确地执行了我想要的操作。
提前致谢,如果需要更多信息,请告诉我。
【问题讨论】:
-
也许你的意思是写
return prune_adj_list(new_adj_list)而不是prune_adj_list(new_adj_list)? -
是的,就是这样。我不知道我是怎么错过的,但谢谢。
标签: python algorithm graph return-value