Pythonでリスト(配列)の要素を右回転するプログラムの書き方
リスト(配列)の要素を右方向に回転(ローテート)したい場合、まず各要素を順に走査して末尾の要素の値を一時的に保存し、続けて残りの要素を1つずつ後ろへずらしながら入れ替えていく、という手順で実現できます。
以下に具体的な実装例を示します。
コード例
my_list = [31, 42, 13, 34, 85, 0, 99, 1, 3]
n = 3
print("変数 n の値:")
print(n)
print("元のリスト:")
print(my_list)
print("リストを3要素分右に回転します...")
for i in range(0, n):
last_elem = my_list[len(my_list)-1]
for j in range(len(my_list)-1, -1, -1):
my_list[j] = my_list[j-1]
my_list[0] = last_elem
print()
print("右回転後のリスト:")
for i in range(0, len(my_list)):
print(my_list[i])
実行結果
変数 n の値: 3 元のリスト: [31, 42, 13, 34, 85, 0, 99, 1, 3] リストを3要素分右に回転します... 右回転後のリスト: 99 1 3 31 42 13 34 85 0
処理の流れ
リストを定義し、コンソールに表示します。
回転させる回数
nを定義し、コンソールに表示します。外側のループでリストを走査し、毎回末尾の要素の値を変数
last_elemに保存します。内側のループでは、
range(len(my_list)-1, -1, -1)のようにステップ幅を -1 に指定し、リストの末尾から先頭に向かって各要素を1つ後ろの位置へ移動させます。保存しておいた末尾の要素を、リストの先頭(インデックス 0)に代入します。
以上の処理を
n回繰り返すことで、リスト全体が3要素分だけ右に回転します。最後に、回転後のリストの内容を1行ずつコンソールに出力します。
補足:スライスを使えば1行で書ける
Pythonでは、スライス(スライシング)を活用すると、同じ処理をもっとシンプルに記述できます。
def right_rotate(lst, n):
n = n % len(lst) # n がリスト長を超える場合にも対応
return lst[-n:] + lst[:-n]
my_list = [31, 42, 13, 34, 85, 0, 99, 1, 3]
print(right_rotate(my_list, 3))
# 出力: [99, 1, 3, 31, 42, 13, 34, 85, 0]
lst[-n:] はリスト末尾の n 個の要素を、lst[:-n] はそれ以外の先頭側の部分を取り出します。この2つを連結するだけで右回転が完成します。また、n % len(lst) としておくことで、回転数がリストの長さより大きい場合でも正しく動作します。
なお、ループ方式の計算量は O(n × k)(k は回転数)になるのに対し、スライス方式は O(n) で済むため、実務ではスライス方式が推奨されます。
-
Pythonでリストの各要素より右側にある小さい要素の数を返すプログラム
問題概要 数値のリスト nums が与えられたとします。このとき、元のリストの各要素について、その要素より右側に存在する小さい要素の個数を求め、それらを並べた新しいリストを作成する問題を考えてみましょう。 例えば、入力が nums = [4, 5, 9, 7, 2] の場合、出力は [1, 1, 2, 1, 0] になります。これは次のような理由によるものです。 4 の右側にある小さい要素は 1 個(2) 5 の右側にある小さい要素は 1 個(2) 9 の右側にある小さい要素は 2 個(7 と 2) 7 の右側にある小さい要素は 1 個(2) 2 の右側には小さい要素が存在しないため 0 個
-
Pythonで2つのリストの共通要素をすべて出力する方法
2つのリストが与えられたとき、両方のリストに共通して含まれるすべての要素を出力するPythonプログラムを紹介します。この問題は、セット(set)型の集合演算を使うことで、シンプルかつ効率的に解決できます。 実行例 入力 : L1 = [5, 6, 7, 8, 9] L2 = [5, 13, 34, 22, 90] 出力 : {5} 説明 上記の例では、2つのリストのどちらにも存在する要素は「5」だけなので、出力は {5} となります。 アルゴリズム 処理の手順は以下のとおりです。 ステップ1 : ユーザーから入力を受け取り、2つのリストを作成する。 ステップ2 : 各リ