2015-12-18 3 views
6

У меня есть список списка, и мне нужно повернуть его на девяносто градусов. Мне удалось получить первую новую строку, но я не смог получить ни одного из них, поэтому я поставил цикл for в функцию a, и я увеличил счет на каждую итерацию, но у меня только что был большой беспорядок, напечатанный на терминале.Как я могу повернуть этот список списков с помощью python

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

Что об использовании 'numpy' для этого: 'numpy.array (grid) .T' – Akavall

+0

@Akavall: Ну, во-первых, это отражение, а не поворот. – user2357112

+1

FYI, [Как вы вращаете двумерный массив?] (Http: // stackoverflow.com/q/42519/364696) охватывает практически все языки, включая Python (http://stackoverflow.com/a/24356420/364696). – ShadowRanger

ответ

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

Out:

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

Или используя немного другой синтаксис, используя print_function, мы можно распаковать с * и указать разделитель с разделителем:

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

Nice. Должен был подумать об этом, мне это нравится лучше, чем [мой ответ] (http://stackoverflow.com/a/34347112/364696) (технически это заканчивается «списком» '' 'tuple', а не оригинальный' list' 'list', но это тривиальное преобразование той же формы, что и преобразование в 'str', как вы это делали. – ShadowRanger

+0

@ShadowRanger, спасибо, я полагаю, я должен действительно используйте itertools.izip и imap для python2. –

+0

Ну, лично я просто использую 'from future_builtins import map, filter, zip' и т. д., потому что мне нравится писать Py2-код, который как можно ближе к Py3 (к сожалению, импорт должен быть обернутым в 'try' /' except ImportError: ', если вы хотите, чтобы он запускался без изменений на обоих, поскольку' future_builtins' даже не существует как заглушка в Py3), но это личное предпочтение. – ShadowRanger

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

Это на самом деле проще сделать это с помощью одномерного массива, чем с 2D массива (Edit: я был неправ, то zip approach is pretty darn easy too, и лучший ИМО, оставляя это для сравнения) , так что просто для удовольствия, мы будем конвертировать в 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', '.', '.', '.', '.'] 

Side-примечание: Если вы на Python 2, что print синтаксис потребовало бы from __future__ import print_function работать.

Смежные вопросы