2

リストキャンプのすべての要素を、リストの各位置に作用する関数「counterPosition」のそれぞれの出力値に置き換える必要があります

camp = [[True, False, False, False, False, True],
         [False, False, False, False, False, True],
         [True, True, False, True, False, True],
         [True, False, False, False, False, False],
         [False, False, True, False, False, False],
         [False, False, False, False, False, False]]


def counterPosition(x, y):
    bombs = 0
    for i in range(x-1, x+2):
        for j in range(y-1, y+2):
            if i<0 or j<0: continue
            elif camp[i][j] == True:
                bombs += 1
    return bombs

for x in range (len(camp)):
   for y in range (len(camp[x])):
       camp[x][y] = counterPosition(x,y)
print camp

これは次のようになります。

IndexError: list index out of range
4

2 に答える 2

2

問題はあなたのcounterPosition機能にあります。特に:

for i in range(x-1, x+2):
    for j in range(y-1, y+2):
        …
        elif camp[i][j] == True:

からまでのx範囲のこの値を渡します。つまり、からの範囲です。したがって、たとえば、最後の行に到達すると、はからの範囲になります。しかし、範囲外です。だからあなたはを取得します。0len(camp)-1i-1len(camp)-1+2x=5i-16camp[6]IndexError

yもちろん、とでも同じ問題が発生しますj

それで、どのようにそれを修正しますか?まあ、それはあなたがやろうとしていることに依存します。しかし、この行を考えると:

if i<0 or j<0: continue

私はあなたが望むものはこれを追加することだと思います:

elif i>=len(camp) or j>=len(camp[i]): continue

実際には、ループの外側でこれらを排除する方が簡単です。たとえば、for i in range(max(x-1, 0), min(x+2, len(camp)):


その間、あなたのプログラムが何をしようとしているのかはわかりませんが、マインスイーパに関連したもののように見えますね。もしそうなら、あなたがこれを修正した後でも、それはあなたが望むことをするつもりはないと思います。との値をカウントに置き換えるTrueと、が真になることはありません。したがって、最終結果は次のようになります。Falsecamp[i][j] == Truei<=x and j<=y

[[2, 2, 2, 1, 3, 2],
 [2, 2, 3, 2, 4, 2],
 [3, 2, 1, 2, 1, 2],
 [1, 3, 2, 3, 1, 2],
 [1, 3, 1, 2, 1, 2],
 [1, 3, 1, 3, 1, 2]]

私があなたがこれを望んでいたかもしれないと思うとき:

[[1, 1, 0, 0, 2, 2],
 [3, 3, 2, 1, 4, 3],
 [3, 3, 2, 1, 3, 2],
 [3, 4, 3, 2, 2, 1],
 [1, 2, 1, 1, 0, 0],
 [0, 1, 1, 1, 0, 0]]

それは与えられた正方形でさえ隣接する爆弾の数です。camp後者を取得するには、同じに対して両方を実行するのではなく、のコピーを反復または変更しますlist。例えば:

newcamp = copy.deepcopy(camp)
for x in range (len(camp)):
   for y in range (len(camp[x])):
       newcamp[x][y] = counterPosition(x,y)
print newcamp

あるいは単に:

camp = [[counterPosition(x, y) for y in range(len(camp[x]))] 
        for x in range(len(camp))]
print camp

(実際には、私は彼らに別の名前を付けbombcampますflagcamp

于 2013-02-27T23:58:50.500 に答える
0

このデータを保存する別の方法は、セットを使用することです。

bombs = {
    (i, j) for i, row in enumerate(camp)
           for j, is_bomb in enumerate(row)
           if is_bomb
}

そして、の代わりにcamp[i][j] == True(i, j) in bombs

于 2013-02-28T00:15:21.070 に答える