2015-12-18 18 views
6

リストのリストがあり、それを90度回転する必要があります。私は最初の新しい行を取得することができたが、私は関数にforループを入れて、繰り返しごとに1ずつカウントを増やしたので、私はちょうどターミナルに印刷された大きな混乱を持っていたので、このリストのリストを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、[2次元配列をどのように回転させますか?](http:// stackoverflow。com/q/42519/364696)は、ほぼすべての言語[Pythonを含む](http://stackoverflow.com/a/24356420/364696)をカバーしています。 – ShadowRanger

答えて

10

何が欲しいのは、リストのリストを転置行に行列と列を作っにある

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

またはprint_functionを使用して、わずかに異なる構文を使用して、我々 *で区切り、区切り記号を区切りとして指定することができます。:

from __future__ import print_function 

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

あなたが使用することができ仲介リストitertoolsを作成したくなかったので、もしそれがなるpython2を使用した:完全を期すため

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

あなたが実際にタプルの代わりにリストを望んだ場合、リストに戻る:

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

ニース。それを考えていて、私はこれを[私の答え](http://stackoverflow.com/a/34347112/364696)よりも好きです(技術的には、 ''リスト 'の元のリストではなく、' 'タプル' 'のリストではなく、' 'str''への変換と同じ形式の簡単な変換です) – ShadowRanger

+0

@ShadowRanger、ありがとう、私は実際にitertools.izipとimapをpython2に使用します。 –

+0

私はPy3にできるだけ近いPy2コードを書くのが好きなので、個人的に、 'from future_builtins import map、filter、zip'などを使っています(悲しいことです。 'future_builtins'がPy3のスタブとして存在しないために、両方で変更せずに実行したい場合は、' try'/'ImportError:'を除外してください。それは個人的な好みです。 – 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', '.', '.', '.', '.']] 

または1行:

>>> 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はこれを行うことができ、画像などの大きな行列の場合は高速です。 (:;比較のためにこれを残しIMO最高、zip approach is pretty darn easy too私が間違っていた、と編集)

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配列であるよりも、それは1次元配列でこれを行うために、実際に簡単です:ここでは簡単な例です

>>> 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を必要とすることを、とても楽しみのためだけに、私たちは、新しい2Dに回転させるよりも、1Dに変換します。

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

アウト:

関連する問題