プログラミングコンテストでは、二次元配列を回転(シフト)させる必要がある問題があります。
そこで、ここでは 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]]