2011-04-02 65 views
3

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

回答

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

它的操作與下面的註釋中所述的相同。 – 2011-04-02 21:53:16

+0

@Mateusz:用小數據樣本在一張紙上逐步檢查你的算法。算法中可能存在邏輯錯誤。 – 2011-04-02 22:33:08

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

我試過使用你的代碼,但是當我把print(i,j)和print r以及'print ind'放在第一個if語句後面時,我已經收到了與之相同的輸出從問題(上面)。即使其他if語句是錯誤的(甚至其中一個),它也應該檢查data.c中的下一個,所以索引應該不同。 – 2011-04-02 21:51:32