在python corectly中使用多个If if语句

时间:2015-08-28 03:07:35

标签: python if-statement for-loop

我正在尝试编写一个程序,其中在列表中的节点之间找到最短路径,例如下面的节点。节点是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())  

1 个答案:

答案 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)

您的代码中可能还有其他问题,我实际上没有检查逻辑,我只是​​指出了这个常见的错误。