1

Python のリストで、削除されると思っていたエントリが残り、別のエントリが削除されました。何故ですか?

問題のあるコードは次のとおりです。

def getAdjacent(pos, bounds):
    posibles = [
    [pos[0]-1, pos[1]],
    [pos[0]+1, pos[1]],
    [pos[0], pos[1]-1],
    [pos[0], pos[1]+1]]
    for p in posibles:
        if isOutside(p,bounds):
            posibles.remove(p)
    return posibles


def isOutside(pos, bounds):
    if pos[0] > bounds[0]-1 or pos[0] < 0 or pos[1] < 0 or pos[1] > bounds[1]-1:
        return True
    else:
        return False

問題を反映するいくつかの入力と出力を次に示します。

In [13]: bounds = [10, 10]

In [14]: p = [9,0]

In [15]: getAdjacent(p, bounds)
Out[15]: [[8, 0], [9, -1], [9, 1]]

In [16]: isOutside([9, -1], bounds)
Out[16]: True

In [17]: isOutside([9, 1], bounds)
Out[17]: False

getAdjacent() が isOutside() に True を再実行させるすべての要素を削除するときに、[9, -1] がまだ getAdjacent() にあるのはなぜですか? [10, 0] がまだそこにないのはなぜですか? マグニチュードの事ですか?

4

1 に答える 1

8

繰り返し処理しているリストから要素を削除しないでください。

for p in posibles:
    if isOutside(p,bounds):
        posibles.remove(p)

これにより、反復が混乱し、エントリがスキップされます。私はこれを次のように書きます

possibles = [p for p in possibles if not isOutside(p, bounds)]
于 2012-05-18T14:21:36.713 に答える