プログラミングコンテストでは、二次元配列を回転(シフト)させる必要がある問題があります。

そこで、ここでは python3 で二次元配列を回転させる方法について説明します。

 
 早速ですが、以下のコードで二次元配列は「右に90°」回転します。

S = [ [1,2,3], 
      [4,5,6], 
      [7,8,9] ]

S = list(zip(*S[::-1]))

for s in S:
    print(s)
# 出力結果
# (7, 4, 1)
# (8, 5, 2)
# (9, 6, 3)

実際に回転を行なっている部分は、以下の部分です。

S = list(zip(*S[::-1]))

上のコードの内容を分解してみると、

まず、

S[::-1]

の部分で、行の上下を入れ替えています。
具体的にコードで確認してみると、

S = [ [1,2,3], 
      [4,5,6], 
      [7,8,9] ]
      
S = S[::-1]

for s in S:
    print(s)
# 出力結果
# [7, 8, 9]
# [4, 5, 6]
# [1, 2, 3]

となり、
1番上の行が最後に、1番下の行が最初に移動されていることがわかります。

次に、

zip(*S[::-1]))

の部分では、S[::-1] で得られた二次元配列に対して、転置が行われています。

ここで転置とは、二次元配列内の要素を、行と列を入れ替えて配置することです。
つまり、
 S[0][1] ⇄ S[1][0] となるように、要素を入れ替えます。

アスタリスク(❇︎)が出てきますが、「うげっ、ポインタかよ!」とか思わなくても全然大丈夫みたいです。。

さらに、それを

list(zip(*S[::-1]))

としているのは、list( ) としておかないと、以下みたいな出力が返されるからです。

S = [ [1,2,3], 
      [4,5,6], 
      [7,8,9] ]

S = zip(*S[::-1])

print(S)
# 出力結果
# <zip object at 0x14efaaaef780>

以上のようにする事で、python3で二次元配列を右に90°回転させることができました。

内容は、二次元配列の行の上下を入れ替えて、その配列(行列)を転置させるものでした。

ちなみに、今回の方法で得られる配列は、タプル型になっています。

もし、リスト型で欲しい場合は以下のようにすれば良いです。

S = [ [1,2,3], 
      [4,5,6], 
      [7,8,9] ]

S = list(map(list,list(zip(*S[::-1]))))

print(S)
# 出力結果
# [[7, 4, 1], [8, 5, 2], [9, 6, 3]]