1

我目前正在尝试用另一个列表中的元素替换 2D 列表中的元素,以实现我在 python 中制作的游戏。这是我到目前为止所拥有的:

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 的索引 using for a in range(len(listA)):,您应该遍历 listA 的元素 usingfor a in listA:

假设 A 中的索引转换为 B 中的坐标,如下所示:

0 1 2
3 4 5
6 7 8

那么 beta,也就是 B 对应的列a,应该计算为a%3,而不是a/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 回答