プログラミングコンテストでは、与えられた配列に対して要素の位置を変更する操作が必要な場合が多々あります。
ここでは、一次元配列に対して要素の位置をシフト(回転)させる方法を紹介します。
python3では、拡張モジュールの一つである NumPy を使えば簡単にできます。
以下に配列 mylist をシフトさせる例を示します。
#(1)
import numpy as np
#(2)
mylist = [0,1,2,3,4,5]
print(mylist)
# --> [0, 1, 2, 3, 4, 5]
#(3)
mylist = np.roll(mylist, 1)
print(mylist)
# --> [5 0 1 2 3 4]
#(4)
mylist = np.roll(mylist, -2)
print(mylist)
# --> [1 2 3 4 5 0]
#(5)
print(' '.join(map(str,mylist)))
# --> 1 2 3 4 5 0
上記の例を個別にみていきます。
まず(1) の部分で、 NumPy は標準モジュールではありませんので、numpyをnpとしてインポートします。
#(1)
import numpy as np
(2) の部分が要素の位置をシフトさせる対象とする配列 mylist で、今回は 0 から 5 までの6つの要素を持っています。
#(2)
mylist = [0,1,2,3,4,5]
print(mylist)
# --> [0, 1, 2, 3, 4, 5]
(3) の部分で、実際に mylist を右側に1つ分要素をシフトさせています。
その方法は、np.roll( ) という関数を用いているだけです。np.roll( ) には、引数として括弧内に(対象とするリスト, シフトさせる数(および方向))を与えています。シフトさせる数については、整数を与え、正の整数であれば右方向に、負の整数であれば左方向にシフトします。よってこの例では、 mylist を右方向に1つ分シフトさせる事が括弧内に記述されている訳です。
また、print分での出力結果をみると、配列内のコンマが無くなっていることが分かるかと思います。これはNumPyでは、通常のpythonのリスト(配列)とは異なる、 ndarray と呼ばれる独自のデータ構造を用いるからです。よって、 np.roll( ) を用いることで、自動的に ndarray に変換されているわけですが、多くの場合は通常のリストと同じように扱うことができるので問題になりません。
#(3)
mylist = np.roll(mylist, 1)
print(mylist)
# --> [5 0 1 2 3 4]
(4) の部分は、 左側に2つ分 要素をシフトさせる例です。
#(4)
mylist = np.roll(mylist, -2)
print(mylist)
# --> [1 2 3 4 5 0]
以上が、 np.roll( ) を使って、python3で一次元配列の要素をシフトさせる操作になります。
おまけとして、リストから要素を(スペース区切りで)一括して出力する例を(5)で示しています。通常のリストと同じように操作できています。リストからの要素の出力についてはこちらをご覧ください。
#(5)
print(' '.join(map(str,mylist)))
# --> 1 2 3 4 5 0