我正在尝试编写一个程序,其中在列表中的节点之间找到最短路径,例如下面的节点。节点是A,B,C,D,它们之间的路径长度列为“A | B | 1”或“B | D | 9”。如果路径存在,程序应该遍历路径并找到从第一个节点到最后一个节点的最短路径。我遇到的部分是代码的最后for
语句(即使这段代码不是最终的,我仍然需要处理它)。最后一个“for”语句崩溃我的python shell然后我必须重新启动它。也许是无限循环?
在这个语句中,我试图将我创建的字典中的值与nextpath
变量的值进行比较,该变量使用字典中的值不断更新。例如,如果AB在nextpath
中,则应将其与字典中的其他值(例如:BD)进行比较,并且由于AB包含B,因此该路径可以链接到BD。问题是,当我尝试这样做时,程序崩溃,我=我被卡住了。
# input given to code "4","A","B","C","D","A|B|1","B|D|9","B|C|3","C|D|4"
import re
def WeightedPath(strarr):
exclude2=[',','"',"|"]
strarr=list(s for s in strarr if s not in exclude2)
numnodes = int(strarr[0])+1
actualnodes=strarr[1:int(strarr[0])+1]
end = len(strarr)
print "____________________________________________________"
paths = strarr[numnodes:end]
paths2=""
for i in paths:
paths2+=i
paths3=re.split('(\d+)',paths2)
paths3=paths3[0:-1] #last item was empty quotes so i got rid of it
print "paths",paths3
paths_2=[] # second item behind weight
paths_1=[] # first item behind weight
pathsnum=[] # actual weight of path
for i in paths3:
if i.isdigit() == True:
paths_2.append(paths3[paths3.index(i)-2])
paths_1.append(paths3[paths3.index(i)-1])
pathsnum.append(paths3[paths3.index(i)])
dictname=paths3[0::2] #names of dict items
dictionary=dict(zip(dictname,pathsnum))
print "names of nodes: ",actualnodes
print "dictionary: ",dictionary
fromnode= actualnodes[0]
tonode= actualnodes[-1]
tohere=[]
for i in dictionary.keys():
if tonode in i:
tohere.append(i)
nextpath=[]
for i in dictionary.keys():
if fromnode in i:
nextpath.append(i)
for i in dictionary.keys():
if i not in nextpath:
for j in nextpath:
if j[0] in i or j[1] in i:
nextpath.append(i)
print "nextpath",nextpath
print WeightedPath(raw_input())
答案 0 :(得分:0)
您不能修改正在迭代的字典/列表。
for j in nextpath:
if j[0] in i or j[1] in i:
nextpath.append(i)
如果条件至少评估为True
一次,那么这些行的结果是不确定的。根据您的需要制作副本或使用索引。
当你开始循环时,这将迭代nextpath
中的任何内容:
for j in list(nextpath):
if j[0] in i or j[1] in i:
nextpath.append(i)
这还包括添加的元素:
index = 0
while index < len(nextpath):
j = nextpath[index]
if j[0] in i or j[1] in i:
nextpath.append(i)
您的代码中可能还有其他问题,我实际上没有检查逻辑,我只是指出了这个常见的错误。