如果if语句为真,如何停止迭代?

时间:2011-04-02 00:10:35

标签: python iteration

我在使用Python停止迭代时遇到了一些麻烦。功能中出现此问题:

for z in range(w.steps):
    for i in range(1,w.x-1):
        for j in range(1,w.y-1):
            print (i, j)
            for r in data.c:
                if w.world[i][j] in r:
                    print r
                    ind = data.c.index(r)
                    print ind
                    if w.world[i-1][j] in data.n[ind]:
                        if w.world[i][j+1] in data.e[ind]:
                            if w.world[i+1][j] in data.s[ind]:
                                if w.world[i][j-1] in data.w[ind]:
                                    w.world[i][j] = data.cc[ind]

步骤数(第一个for循环)由用户提供。接下来的两个for循环用于迭代二维数组(x - 行,y - cols):

for i in range(1,w.x-1):
    for j in range(1,w.y-1):

(打印仅用于控制) 对于数组中的每个单元格,我想要检查它的值。我在data.c列表中有所有可能的值(比如value = 14),看起来像那个:

li = [[2],[14,23],[4]]

所以说明:

for r in data.c:
    if w.world[i][j] in r:

我想在第一个true出现时停止迭代。如果函数将达到第一个相等的值,我想分配包含它的列表索引,并执行其他语句:

ind = data.c.index(r)
    if w.world[i-1][j] in data.n[ind]:
        if w.world[i][j+1] in data.e[ind]:
            if w.world[i+1][j] in data.s[ind]:
                if w.world[i][j-1] in data.w[ind]:
                    w.world[i][j] = data.cc[ind]

如果所有这些都是true,我想执行最后一条指令(赋值),然后从数组转到下一个单元格。但如果其中至少有一个是false,我想回去,并寻找data.c列表中的下一个匹配(可能不止一个)。所有可能性中的列表值都是肯定的。重点是先使用匹配的。

我为1个单元格尝试了这个函数,我得到的索引比预期多得多,我不知道为什么。使用我的注释从数组输出一个单元格:

(1, 1)     # print(i,j)
[0]        # print r
3          # print data.c.index(r)
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3
[0]
3

我会非常感谢任何帮助,因为我长时间处理这个算法(我是编程的初学者)。

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您需要发出break声明。

for z in range(w.steps):
    for i in range(1,w.x-1):
        for j in range(1,w.y-1):
            print (i, j)
            for r in data.c:
                if w.world[i][j] in r:
                    print r
                    ind = data.c.index(r)
                    print ind
                    if w.world[i-1][j] in data.n[ind]:
                        if w.world[i][j+1] in data.e[ind]:
                            if w.world[i+1][j] in data.s[ind]:
                                if w.world[i][j-1] in data.w[ind]:
                                    w.world[i][j] = data.cc[ind]
                                    break # <-- break "for r" and continue with "for j"

答案 1 :(得分:0)

    for (z,i,j) in itertools.product(range(w.steps), range(1,w.x-1)), range(1,w.y-1)):
        for r in data.c:
            if w.world[i][j] in r :
                ind = data.c.index(r)
                if all (itertools.imap(lambda x, y: x in y, 
                                    (w.world[i-1][j], w.world[i][j+1],w.world[i+1][j], w.world[i][j-1]), 
                                    (data.n[ind], data.e[ind], data.s[ind], data.w[ind]))):
                    w.world[i][j] = data.cc[ind]
                    break