4

次のようなタプルのリストがあります

a = [(1, 2), (2, 2), (3, 2)]

このリストの長さはさまざまです。順序は逆にすることもできます。

a = [(3, 2), (2, 2), (1, 2)]

次のようなリストのリストもあります。

b = [['0', '0', '0'], ['0', '0', '0'], ['0', '0', '0'], ['0', '0', '0']]

ここで、このリストのリストをループして、インデックスを持つアイテムを変更したいと思います。

b[3][2]
b[2][2]
b[1][2]

したがって、インデックスは a に依存します。私はこれを試しました:

for item in indexes_list:
    b[item[0]][item[1]] = '1'

しかし、これは最後の列全体を変更します(最後の列の最後の3つの項目のみをaで指定されたインデックスで変更したい)。これを達成するための最良の方法は何ですか?

編集:回答ありがとうございますが、私にはうまくいきませんでした。私は両方を試しましたが、同じことが起こります。問題を単純化しようとしたため、indexs_listでもその間違いを犯しました(タイプミスでした)。私はさらに詳しく説明する必要がありました。

リストのリストは、ある種の三目並べボード用です。ユーザーが入力した動きが相手の駒を挟むかどうかをテストする必要があります。3×3の盤である必要はないので、相手の複数の駒を挟むようなロングムーブが可能です。移動が相手の駒を挟む場合、相手の駒は消滅し、ユーザーの駒に置き換えられます。

両方の方法を試すと、最初に for ループを通過した後、列全体に対してすばやく実行されます (ブレークポイントを配置してデバッグすると、これが検出されました)。ここに私のプログラムのコードがあります:

    for i, j in (indexes[0])[:len(y_p.rstrip('.'))]:
            print item
            board[i][j] = user
            print board

print ステートメントを使用して、デバッグ中に何が起こるかを確認しました。ユーザーは、ユーザー ピースの str 値を保持する変数です。rstrip メソッドは、どこまで移動すべきかを検出するために使用されます。

デフォルトでは、ボードは次のとおりです。

[['.', '.', '.', '.', '.'], ['.', 'X', 'O', '.', '.'], ['.', 'O', 'X', '.', '.'], ['.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.']]

y_p プリント

'.OX.' # board[3][1] + board[2][1] + board[1][1] + board[0][1]

インデックス[0] プリント

[(3, 1), (2, 1), (1, 1), (0, 1)]

しかし、私はそれをしたいだけです

[(3, 1), (2, 1), (1, 1)]

board[0][1] 座標が空のスペースを定義しているため (無効)。このリストの最初にある座標ボード[3][1]は、ユーザーが移動したい場所です。board[2][1] は対戦相手の駒、board[1][1] はユーザーの駒です。したがって、座標によって定義されたピースを回転させる必要があります

[(3, 1), (2, 1), (1, 1)]

ユーザーの作品に。ただし、代わりにこれらの座標に対して実行します (これは 5x5 ボードであることに注意してください)。

[(4,1), (3, 1), (2, 1), (1, 1)]

そのため、最初のインデックス リストに含まれていなくても、board[4][1] でさえ変更されます。実行後、ボードは次のようになります。

[['.', 'X', '.', '.', '.'], ['.', 'X', 'O', '.', '.'], ['.', 'O', 'X', '.', '.'], ['.', 'X', '.', '.', '.'], ['.', 'X', '.', '.', '.']]

これは正しくありません (最初と最後の行の「X」は存在しないはずです)

4

2 に答える 2

7

1つの問題は、インデックスのリストが呼び出されaているのに、を参照していることindexes_listです。

このエラーを修正すると機能します: (ideone)

indexes_list = [(3, 2), (2, 2), (1, 2)]
b = [['0', '0', '0'], ['0', '0', '0'], ['0', '0', '0'], ['0', '0', '0']]

for item in indexes_list:
    b[item[0]][item[1]] = '1'

print b

結果:

[['0', '0', '0'], ['0', '0', '1'], ['0', '0', '1'], ['0', '0', '1']]

注:「試してみましたが、うまくいきません」と言う前に、コードを注意深く読み、特にb構成方法に注意してください。次の非常によく似た選択肢は、同じリストへの4つの参照を含むリストを作成するため、機能しません。

それを行う間違った方法: (ideone)

bb = ['0', '0', '0']
b = [bb, bb, bb, bb]          # Wrong!!!

それを行う別の間違った方法: (ideone)

b = [['0', '0', '0']] * 4     # Wrong!!!
于 2012-05-20T11:59:12.337 に答える
3
a = [(1, 2), (2, 2), (3, 2)]
b = [['0', '0', '0'], ['0', '0', '0'], ['0', '0', '0'], ['0', '0', '0']]
for i, j in a:
    b[i][j] = '1'

print b
[['0', '0', '0'], ['0', '0', '1'], ['0', '0', '1'], ['0', '0', '1']]
于 2012-05-20T12:00:12.453 に答える