如何在条件为真时停止迭代?

4 投票
2 回答
8871 浏览
提问于 2025-04-16 14:55

我在使用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列):

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

(打印输出只是为了控制流程)

对于数组中的每一个单元格,我想检查它的值。我在一个名为data.c的列表中有所有可能的值(假设值是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)     # 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

在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。这时候,很多人会选择去StackOverflow这样的论坛寻求帮助。在这些论坛上,大家会分享自己的问题和解决方案,互相帮助。

比如,有人可能会遇到一个错误,想知道怎么解决。其他人看到这个问题后,可能会提供一些建议,告诉他应该检查哪些地方,或者提供一些代码示例来帮助他理解。

总之,StackOverflow是一个很好的地方,可以让编程新手和有经验的开发者一起交流,学习更多的编程知识。

    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
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"

撰写回答