我有一个列表列表,我需要将它旋转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
答案 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' '.' '.' '.' '.']]