如何在条件为真时停止迭代?
我在使用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"