嵌套条件语句

时间:2014-05-02 23:15:35

标签: python python-2.7 networkx

请下面的代码确定两个随机选择的节点之间的最短路径长度,然后打印它们之间的路径长度。我需要在循环中插入一个条件来测试测试两个节点之间的路径长度,并继续直到所有输出都满足这个条件(> = 1.5和< = 2)。我真的很困惑如何在现有的循环中嵌套它。我把三重引号中的内容包括在内。这似乎是一个无限循环,因此没有帮助。请帮忙。谢谢

import networkx as nx
import random as rand

pos = {1001:(-42503,-3748871),1002:(-42267,-3749806),1003:(-40938,-3750235),1004: (-39452,-3750624),1005:(-39985,-3749564),1006:(-38473,-3749615),1007:(-41714,-3747171),1008:(-42279,-3745275),1009:(-41853,-3744185),1010:(-42000,-3746561),1011:(-42651,-3746188),1012:(-42195,-3747788),1013:(-41498,-3748890),1014:(-40366,-3748684),1015:(-43036,-3750284)}

edge = [(1001, 1003,{'length':0.35}),(1001, 1004,{'length':0.46}),(1001, 1009,{'length':0.49}),(1002, 1007,{'length':0.22}),(1002, 9972,{'length':0.54}),(1002, 1013,{'length':0.59}),(1003, 1014,{'length':0.25}),(1004, 1010,{'length':0.29}),(1004, 1013,{'length':0.57}),(1004, 1003,{'length':0.43}),(1004, 1006,{'length':0.37}),(1005, 1002,{'length':0.23}),(1005, 14566,{'length':0.72}),(1006, 1005,{'length':0.6}),(1007, 1003,{'length':0.39}),(1007, 1010,{'length':0.11}),(1009, 1001,{'length':0.51}),(1010, 1005,{'length':0.2}),(1011, 1004,{'length':0.37}),(1012, 1006,{'length':0.17}),(1013, 1005,{'length':0.19}),(1013, 1007,{'length':0.21}),(1014, 1005,{'length':0.35}),(1014, 1009,{'length':0.51})]


X = nx.MultiDiGraph()
X.add_nodes_from(pos.keys())
X.add_edges_from(edge)


num_routes = 5

for i in range(num_routes):

while True:

    try:
        A = int(rand.choice(pos.keys()))
        B = int(rand.choice(pos.keys()))
        path = nx.dijkstra_path(X,A,B,weight='length')
        pathlength = round(nx.dijkstra_path_length(X,A,B,weight='length'),2)

        ''' 
        while pathlength >= 1.5 and pathlength <= 2: 

            continue

        else: pathlength = round(nx.dijkstra_path_length(X,A,B,weight='length'),2)

        '''

    except:

        continue

    break

print pathlength

output:
pathlength:  2.2
pathlength:  2.94
pathlength:  1.46
pathlength:  1.37
pathlength:  0.77

2 个答案:

答案 0 :(得分:1)

for i in range(num_routes):
    while True:
        try:
            A = int(rand.choice(pos.keys()))
            B = int(rand.choice(pos.keys()))
            path = nx.dijkstra_path(X,A,B,weight='length')
            pathlength = round(nx.dijkstra_path_length(X,A,B,weight='length'),2)
            print path,A,B,pathlength  ,i
            if 1.5 <= pathlength <= 2:
                break
            else:
                pathlength 
        except:pass
    print pathlength,A,B

这应该有效。如果我理解正确的话! 编辑了我的代码,我不必要地做了额外的循环。

答案 1 :(得分:1)

您似乎对循环中breakcontinue的功能感到有些困惑。 break将告诉python它应该立即完成循环而不再进行任何迭代,而continue只是告诉它跳过其余的当前迭代并继续下一步(基本上在while True:的情况下重新启动循环。在while循环结束时你拥有的break会在第一次运行后立即退出循环!

for i in range(num_routes):

    while True:

        try:
            A = int(rand.choice(pos.keys()))
            B = int(rand.choice(pos.keys()))
            path = nx.dijkstra_path(X,A,B,weight='length')
            pathlength = round(nx.dijkstra_path_length(X,A,B,weight='length'),2)
            if pathlength >= 1.5 and pathlength <= 2: 
                break
        except:
            continue

    print pathlength