如何使用python旋转此列表列表

时间:2015-12-18 01:09:58

标签: python

我有一个列表列表,我需要将它旋转90度。我设法获得了第一个新行,但我无法得到任何其他的所以我把for循环放入一个函数中,我每次迭代都增加了一个计数,但我刚刚给终端打印了一大堆。

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

4 个答案:

答案 0 :(得分:10)

你想要的是转置你的列表列表,使行列和列成行:

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(*grid))))

输出:

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

或者使用print_function使用稍微不同的语法,我们可以使用*解压缩并使用sep指定分隔符:

from __future__ import print_function

print(*map("".join,zip(*grid)),sep="\n")

如果您不想创建中间列表,请使用python2,您可以使用itertools,这样就可以了:

from __future__ import print_function
from itertools import imap, izip
print(*imap("".join,izip(*grid)),sep="\n")

为了完整性并向您展示您的转置列表的确切含义:

from pprint import pprint as pp
pp(list(zip(*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', '.', '.', '.', '.')]

如果您真的想要列表而不是元组,那么您可以map返回列表:

pp(list(map(list,zip(*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', '.', '.', '.', '.']]

答案 1 :(得分:5)

索引魔法:

>>> 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 :(得分:2)

使用一维数组实际上比使用2D数组更容易(编辑:我错了,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才能正常工作。

答案 3 :(得分:1)

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