Python
 Computer >> コンピューター >  >> プログラミング >> Python

【初心者向け】Pythonでリストをn個だけ右に回転させる方法3選

ユーザーが入力したリストと回転数(n)が与えられたとき、そのリストを指定した数だけ右方向に回転させるのが今回の課題です。

例えば、リスト [2, 4, 5, 12, 90]3 回転させると、末尾の要素が先頭に移動し、結果は [90, 12, 2, 4, 5] のようになります。このように「右回転」とは、リストの末尾から n 個の要素を取り出して先頭に移動する操作のことです。

実行例

Input A= [2, 4, 5, 12, 90]
rotation number=3
Output [ 90,12,2, 4, 5]

それでは、代表的な3つの実装方法を順番に見ていきましょう。

方法1:forループで各要素を順に処理する

1つ目の方法は、リスト内の各要素を順番に走査し、新しいリストの適切な位置に挿入していくシンプルなアプローチです。まず末尾の n 要素を追加し、その後に残りの先頭側の要素を追加します。

def right_rotation(my_list, num): 
   output_list = []
   # 末尾のnum個の要素を先に追加
   for item in range(len(my_list) - num, len(my_list)):
      output_list.append(my_list[item])
   # 残りの先頭側の要素を追加
   for item in range(0, len(my_list) - num):
      output_list.append(my_list[item])
   return output_list
# Driver Code
A=list()
n=int(input("Enter the size of the List"))
print("Enter the number")
for i in range(int(n)):
   p=int(input("n="))
   A.append(int(p))
   print (A)
rot_num=int(input("Enter rotate number"))
print("After rotation",right_rotation(A, rot_num))

出力結果

Enter the size of the List 6
Enter the number
n= 11
[11]
n= 22
[11, 22]
n= 33
[11, 22, 33]
n= 44
[11, 22, 33, 44]
n= 55
[11, 22, 33, 44, 55]
n= 66
[11, 22, 33, 44, 55, 66]
Enter rotate number 3
After rotation [44, 55, 66, 11, 22, 33]

ループ処理が明示されているため、回転の仕組みが分かりやすいのが特徴です。ただし、コード量がやや多くなる点がデメリットといえます。

方法2:len()とスライシングを組み合わせる

2つ目の方法では、len() 関数とスライス構文を活用します。A[len(A) - n:len(A)] で末尾の n 要素を取得し、A[0:len(A) - n] で残りの要素を取得して連結します。

A=list()
ni=int(input("Enter the size of the List"))
print("Enter the number")
for i in range(int(ni)):
   p=int(input("ni="))
   A.append(int(p))
   print (A)
n = 3
A = (A[len(A) - n:len(A)] + A[0:len(A) - n])
print("After Rotation",A)

出力結果

Enter the size of the List 6
Enter the number
ni= 11
[11]
ni= 22
[11, 22]
ni= 33
[11, 22, 33]
ni= 44
[11, 22, 33, 44]
ni= 55
[11, 22, 33, 44, 55]
ni= 66
[11, 22, 33, 44, 55, 66]
After Rotation [44, 55, 66, 11, 22, 33]

方法3:負のインデックスによるスライスを使う(最も簡潔)

3つ目の方法は、Python特有の負のインデックス指定を利用した最もエレガントな手法です。A[-n:] でリストの末尾 n 要素を、A[:-n] で先頭から末尾 n 要素を除いた部分をそれぞれ取得し、連結します。

A=list()
ni=int(input("Enter the size of the List"))
print("Enter the number")
for i in range(int(ni)):
   p=int(input("ni="))
   A.append(int(p))
   print (A)
n = 3
A = (A[-n:] + A[:-n])
print("After Rotation",A)

出力結果

Enter the size of the List 6
Enter the number
ni= 11
[11]
ni= 22
[11, 22]
ni= 33
[11, 22, 33]
ni= 44
[11, 22, 33, 44]
ni= 55
[11, 22, 33, 44, 55]
ni= 66
[11, 22, 33, 44, 55, 66]
After Rotation [44, 55, 66, 11, 22, 33]

わずか1行で回転処理が完結するため、実務でもこの書き方がよく使われます。

まとめ

方法特徴
方法1:forループ処理の流れが分かりやすいが、コードが長くなる
方法2:len()+スライスインデックス計算が明示的で理解しやすい
方法3:負のインデックス最も簡潔でPythonらしい書き方

なお、標準ライブラリの collections.deque を使えば、rotate(-n) メソッドひとつで同じ操作を実現できるので、パフォーマンスが重要な場面ではこちらも検討するとよいでしょう。

  1. Pythonでリストの累積和(累積合計)を求める方法

    この記事では、リストの累積和(累積合計)を求める問題の解決策について詳しく解説します。問題文あるリストが与えられたとき、各要素までの累積和を格納した新しいリストを作成する必要があります。例えば、[10, 20, 30, 40, 50] というリストが与えられた場合、出力は [10, 30, 60, 100, 150] となります。これは、各位置でそれ以前の要素をすべて足し合わせた値です。実装例それでは、実際の実装を見ていきましょう。# 累積和を求める関数 def Cumulative(l): new = [] cumsum = 0 for element in l:

  2. Pythonで2つの辞書をマージするプログラムの書き方

    この記事では、Pythonを使って2つの辞書(ディクショナリ)を1つに結合(マージ)するプログラムを紹介します。辞書の結合には、組み込みメソッドである update() を使用します。update() メソッドは、引数に渡した辞書の要素を呼び出し元の辞書へ追加することで、2つの辞書を統合できます。 なお、update() の戻り値は None です。つまり新しい辞書が生成されるわけではなく、既存の辞書そのものが直接更新されるという点に注意してください。 実行例 入力:: A = {AAA: 10} B = {BBB: 20} 出力:: C = {BBB: 20, AAA: 10} アルゴリ