【问题标题】:Get list column wise from a 2D Grid created via list comprehension从通过列表理解创建的 2D 网格中明智地获取列表列
【发布时间】:2015-08-22 01:00:36
【问题描述】:

我使用列表推导创建了一个 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)上应用我所需的处理。

但是我面临着如何明智地进行相同类型的处理的困难。有什么方法可以让我在列表列中获取网格的元素。

注意:宽度和高度的大小也会很谨慎,并不总是相同。

【问题讨论】:

  • 实际上我继续使用简单的 2D 数组遍历(按列)方法来完成我的任务,但仍然想要一个更好的方法。

标签: python list multidimensional-array


【解决方案1】:

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

for column in range(self.width):
    dummy_temp_line = [self.grid[x][column] for x in range(self.height)]

【讨论】:

    【解决方案2】:

    你可以转置:

     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]]
    

    【讨论】:

    • 这是转置副本还是修改原始列表
    • @Krishna_Oza,您正在创建一个新列表。如果你想要一个真正的二维数组,你可能会发现 numpy 很有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    相关资源
    最近更新 更多