如果语句正确时如何停止迭代?

问题描述:

我在使用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 -rows,y -cols):

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

(打印仅用于控制) 对于阵列中的每个小区我wanto以检查其值。我把所有可能的值(假设值= 14)data.c列表,它看起来像一个:

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 

我会很感激的任何帮助,因为我负责的这个算法很长一段时间(我在编程初学者)。

+16

一个好的经验法则:如果你需要9个级别的缩进,考虑重构你的代码。 – 2011-04-02 00:12:48

+1

我真的建议你去找一些Python书(真的 - 任何一本书)并阅读它。通读全部内容。通过例子学习,即使不知道即使是一半的语法结构也是非常痛苦的。毫无意义。这就是我被介绍给我的第一语言 - 帕斯卡,我想我失去了很多时间。 – julkiewicz 2011-04-02 00:22:30

+1

感谢所有的建议,我会重构我的代码。 我知道最好的方法是首先阅读整本书,但事实是我们有一些项目需要为课程做,有时不幸的是没有时间阅读全部内容。 – 2011-04-02 00:28:21

如果我理解正确,则需要放置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" 
+0

它的操作与下面的注释中所述的相同。 – 2011-04-02 21:53:16

+0

@Mateusz:用小数据样本在一张纸上逐步检查你的算法。算法中可能存在逻辑错误。 – 2011-04-02 22:33:08

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 
+0

我试过使用你的代码,但是当我把print(i,j)和print r以及'print ind'放在第一个if语句后面时,我已经收到了与之相同的输出从问题(上面)。即使其他if语句是错误的(甚至其中一个),它也应该检查data.c中的下一个,所以索引应该不同。 – 2011-04-02 21:51:32