从通过列表推导创建的2D网格中获取列表

时间:2015-06-07 13:50:15

标签: python list multidimensional-array

我使用列表推导创建了一个2D网格,列表列表如下所示。

self.grid = [[0 for col in range(self.width)]
                     for row in range(self.height)]

宽度和高度用作输入列表的列和行值。

这将是我将用作2D数组的内容,并希望使用单个语句以行方式和列方式访问整个列表(元素)。

对于上面显示的网格,我可以使用一个简单的for循环一次迭代网格行一次处理每一行。

for row in range(self.height):
                dummy_temp_line = list(self.grid[row])

我现在可以直接在dummy_temp_line list上直接应用我所需的处理。

但我面临着如何处理相同类型的处理列方面的困难。有没有办法我可以在列表中明确获取网格的元素。

注意:宽度和高度的大小也会保持警惕,但并不总是相同。

2 个答案:

答案 0 :(得分:0)

你可以转置:

 data =  [[0 for col in range(self.width)]
                 for row in range(self.height)]


zipped = zip(*data)

演示:

data =  [list(range(5))  for row in range(5)]

print(data)

print(list(zip(*data)))
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4],   [0, 1, 2, 3, 4]]
[(0, 0, 0, 0, 0), (1, 1, 1, 1, 1), (2, 2, 2, 2, 2), (3, 3, 3, 3, 3), (4, 4, 4, 4, 4)

如果要更新原始对象self.grid:

self.grid[:] = map(list(zip*(whatever for sub in zip(*self.grid))))

正如我在评论中提到的,您可能会发现numpy很有用,您可以使用以下命令更改原始数组:

data = np.array([range(5) for row in range(5)])

for col in data.transpose():
    col *= 10
print(data)
[[ 0 10 20 30 40]
[ 0 10 20 30 40]
 [ 0 10 20 30 40]
 [ 0 10 20 30 40]
 [ 0 10 20 30 40]]

您可以对所有行,特定行,列等执行计算。

data *= 100

print(data)

data[:,1] += 50

print(data)

[[  0 100 200 300 400]
 [  0 100 200 300 400]
 [  0 100 200 300 400]
 [  0 100 200 300 400]
 [  0 100 200 300 400]]
[[  0 150 200 300 400]
 [  0 150 200 300 400]
 [  0 150 200 300 400]
 [  0 150 200 300 400]
 [  0 150 200 300 400]]

答案 1 :(得分:0)

转置整个网格的另一种解决方案是使用列表推导来生成所需的单个列:

define('DB_CHARSET', 'utf8');