1

私は現在、Pythonで作成しているゲームを実装するために、2Dリストの要素を別のリストの要素に置き換えようとしています。これが私がこれまでに持っているものです:

listA = [1, 3, 5]
listB = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

for a in range(len(listA)):
    alpha = (a/3) #number of rows in listB
    beta = (a/3) #number of columns in listB
    listB[alpha][beta] = 123

これを行うと、

[[123, 123, 123], [0, 0, 0], [0, 0, 0]] 

パラメータを指定して欲しいものの代わりに、

[[0, 123, 0], [123, 0, 123], [0, 0, 0]]

私は何か間違ったことをしていますか?

4

4 に答える 4

3

を使用して listA のインデックスを反復処理する代わりに、を使用してfor a in range(len(listA)):listA の要素を反復処理する必要があります。for a in listA:

A のインデックスが次のように B の座標に変換されると仮定します。

0 1 2
3 4 5
6 7 8

次に、ベータ、別名 に対応する B の列は、 ではなくaとして計算する必要があります。a%3a/3

listA = [1, 3, 5]
listB = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

for a in listA:
    #two slashes is integer division, not a comment, 
    #despite markup's color scheme
    alpha = a//3 
    beta = a%3
    listB[alpha][beta] = 123

print listB

出力:

[[0, 123, 0], [123, 0, 123], [0, 0, 0]]
于 2013-03-05T15:42:45.083 に答える
3

これを使用する場合numpyは非常に簡単です:

import numpy as np

A = np.array([1,3,5])
B = np.zeros((3,3))

B.flat[A] = 123

print B

アウト:

[[   0.  123.    0.]
 [ 123.    0.  123.]
 [   0.    0.    0.]]

.flatリストの「フラット化された」バージョンを返すことに注意してください。

[   0.  123.    0.  123.    0.  123.    0.    0.    0.]
于 2013-03-05T15:43:38.047 に答える
1
>>> for a in range(len(listA)):
...     alpha = (listA[a]/3) #number of rows in listB
...     beta = (listA[a]%3) #number of columns in listB
...     listB[alpha][beta] = 123
... 
>>> listB
[[0, 123, 0], [123, 0, 123], [0, 0, 0]]

listA 内の要素を使用する必要があります。そうしないと、範囲によって生成されたインデックスを使用するのが難しくなります。また、行と列のインデックスを適切に取得するには、少し計算する必要があります

編集:ケビンの答えと説明をご覧になることをお勧めします。私のものは、コードの簡単な修正です。

于 2013-03-05T15:44:30.320 に答える
0
>>> listA = [1, 3, 5]
>>> listB = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> listB_unwrapped = list(chain(*listB))
>>> for i in listA:
    listB_unwrapped[i] = 123


>>> listB = zip(*[iter(listB_unwrapped)]*3)
>>> listB
[(0, 123, 0), (123, 0, 123), (0, 0, 0)]
>>> 
于 2013-03-05T15:46:12.877 に答える