【问题标题】:How can I rotate this list of lists with python [duplicate]如何使用 python 轮换这个列表列表 [重复]
【发布时间】:2016-03-24 15:45:27
【问题描述】:

我有一个列表,我需要将它旋转 90 度。我设法获得了第一个新行,但我无法获得其他任何行,因此我将 for 循环放入 aa 函数中,并且每次迭代都将计数增加一个,但我刚刚在终端上打印出大杂烩。

grid = [['.', '.', '.', '.', '.', '.'],
        ['.', '0', '0', '.', '.', '.'],
        ['0', '0', '0', '0', '.', '.'],
        ['0', '0', '0', '0', '0', '.'],
        ['.', '0', '0', '0', '0', '0'],
        ['0', '0', '0', '0', '0', '.'],
        ['0', '0', '0', '0', '.', '.'],
        ['.', '0', '0', '.', '.', '.'],
        ['.', '.', '.', '.', '.', '.']]

我需要如何旋转。

'''
..00.00..
.0000000.
.0000000.
..00000..
...000...
....0....

'''

我的代码

def get_row(grid, new_grid, new_row, count):
    for row in grid:
        new_row.append(row[count])
    new_grid.append(new_row)

new_grid = []
new_row = []
count = 0

for x in range(0, 6):
    count = 0
    get_row(grid, new_grid, new_row, count)
    count +=1

for row in new_grid:
    print row

【问题讨论】:

标签: python


【解决方案1】:

索引魔法:

>>> grid = [['.', '.', '.', '.', '.', '.'],
        ['.', '0', '0', '.', '.', '.'],
        ['0', '0', '0', '0', '.', '.'],
        ['0', '0', '0', '0', '0', '.'],
        ['.', '0', '0', '0', '0', '0'],
        ['0', '0', '0', '0', '0', '.'],
        ['0', '0', '0', '0', '.', '.'],
        ['.', '0', '0', '.', '.', '.'],
        ['.', '.', '.', '.', '.', '.']]
>>> for i in range(len(grid[0])): #assuming they all have the same length
    print (''.join(x[i] for x in grid))


..00.00..
.0000000.
.0000000.
..00000..
...000...
....0....

或保存到新网格:

>>> newgrid = []
>>> for i in range(len(grid[0])): #assuming they all have the same length
    newgrid.append([x[i] for x in grid])


>>> newgrid
[['.', '.', '0', '0', '.', '0', '0', '.', '.'],
 ['.', '0', '0', '0', '0', '0', '0', '0', '.'],
 ['.', '0', '0', '0', '0', '0', '0', '0', '.'],
 ['.', '.', '0', '0', '0', '0', '0', '.', '.'],
 ['.', '.', '.', '0', '0', '0', '.', '.', '.'],
 ['.', '.', '.', '.', '0', '.', '.', '.', '.']]

或一行:

>>> newgrid = [[x[i] for x in grid] for i in range(len(grid[0]))]
>>> newgrid
[['.', '.', '0', '0', '.', '0', '0', '.', '.'],
 ['.', '0', '0', '0', '0', '0', '0', '0', '.'],
 ['.', '0', '0', '0', '0', '0', '0', '0', '.'],
 ['.', '.', '0', '0', '0', '0', '0', '.', '.'],
 ['.', '.', '.', '0', '0', '0', '.', '.', '.'],
 ['.', '.', '.', '.', '0', '.', '.', '.', '.']]

【讨论】:

  • 这个答案是错误的。它不只是旋转图像,而是转置它(意味着它旋转然后镜像它)。在这种情况下,它看起来是正确的,因为图像是对称的。
【解决方案2】:

numpy.rot90 可以做到这一点,并且对于图像等大型矩阵来说速度很快:

import numpy as np

grid = [['.', '.', '.', '.', '.', '.'],
        ['.', '0', '0', '.', '.', '.'],
        ['0', '0', '0', '0', '.', '.'],
        ['0', '0', '0', '0', '0', '.'],
        ['.', '0', '0', '0', '0', '0'],
        ['0', '0', '0', '0', '0', '.'],
        ['0', '0', '0', '0', '.', '.'],
        ['.', '0', '0', '.', '.', '.'],
        ['.', '.', '.', '.', '.', '.']]
grid = np.rot90(grid, k=3)   
print(grid)

# [['.' '.' '0' '0' '.' '0' '0' '.' '.']
#  ['.' '0' '0' '0' '0' '0' '0' '0' '.']
#  ['.' '0' '0' '0' '0' '0' '0' '0' '.']
#  ['.' '.' '0' '0' '0' '0' '0' '.' '.']
#  ['.' '.' '.' '0' '0' '0' '.' '.' '.']
#  ['.' '.' '.' '.' '0' '.' '.' '.' '.']]

【讨论】:

    【解决方案3】:

    实际上,使用一维数组比使用二维数组更容易(编辑:我错了,zip approach is pretty darn easy too 和最好的 IMO;将此留作比较),所以只是为了好玩,我们'将转换为 1D,而不是旋转为新的 2D:

    >>> from itertools import chain
    >>> # Collapses to 1D
    >>> grid1d = list(chain(*grid))
    >>> # Rotates and rebuilds as 2D
    >>> numcolumns = len(grid[0])
    >>> rotated = [grid1d[i::numcolumns] for i in range(numcolumns)]
    >>> print(*rotated, sep="\n")
    ['.', '.', '0', '0', '.', '0', '0', '.', '.']
    ['.', '0', '0', '0', '0', '0', '0', '0', '.']
    ['.', '0', '0', '0', '0', '0', '0', '0', '.']
    ['.', '.', '0', '0', '0', '0', '0', '.', '.']
    ['.', '.', '.', '0', '0', '0', '.', '.', '.']
    ['.', '.', '.', '.', '0', '.', '.', '.', '.']
    

    旁注:如果您使用的是 Python 2,print 语法将需要 from __future__ import print_function 才能工作。

    【讨论】:

      【解决方案4】:

      您可以使用 zip(*reversed(your_list)) 将列表旋转 90°,如下所示:

      grid = [['.', '.', '.', '.', '.', '.'],
              ['.', '0', '0', '.', '.', '.'],
              ['0', '0', '0', '0', '.', '.'],
              ['0', '0', '0', '0', '0', '.'],
              ['.', '0', '0', '0', '0', '0'],
              ['0', '0', '0', '0', '0', '.'],
              ['0', '0', '0', '0', '.', '.'],
              ['.', '0', '0', '.', '.', '.'],
              ['.', '.', '.', '.', '.', '.']]
      
      print("\n".join(map("".join, zip(*reversed(grid)))))
      

      输出:

      ..00.00..
      .0000000.
      .0000000.
      ..00000..
      ...000...
      ....0....
      

      您可以使用reversed(grid) 而不是reversed(grid),它也会反转外部列表,但它会创建您的列表的副本,这会使用更多内存(这里我也使用pprint 来向您展示您的确切内容转置列表看起来像):

      from pprint import pprint
      pprint(list(zip(*grid[::-1])))
      
      [('.', '.', '0', '0', '.', '0', '0', '.', '.'),
       ('.', '0', '0', '0', '0', '0', '0', '0', '.'),
       ('.', '0', '0', '0', '0', '0', '0', '0', '.'),
       ('.', '.', '0', '0', '0', '0', '0', '.', '.'),
       ('.', '.', '.', '0', '0', '0', '.', '.', '.'),
       ('.', '.', '.', '.', '0', '.', '.', '.', '.')]
      

      如果你真的想要列表而不是元组,你可以将它们转换回列表:

      pprint([list(row) for row in zip(*reversed(grid))])
      
      [['.', '.', '0', '0', '.', '0', '0', '.', '.'],
       ['.', '0', '0', '0', '0', '0', '0', '0', '.'],
       ['.', '0', '0', '0', '0', '0', '0', '0', '.'],
       ['.', '.', '0', '0', '0', '0', '0', '.', '.'],
       ['.', '.', '.', '0', '0', '0', '.', '.', '.'],
       ['.', '.', '.', '.', '0', '.', '.', '.', '.']]
      

      【讨论】:

      • 现在我们有了python3,用于简单地打印数组,而不是使用print('\n'.join(array)),我现在通常使用print(*array,sep='\n')
      猜你喜欢
      • 2012-03-16
      • 2018-08-08
      • 2016-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      • 2020-08-19
      • 1970-01-01
      相关资源
      最近更新 更多