Pythonでリストをローテーションする3つの方法|スライス・内包表記・dequeの実装例
リスト(List)はPythonにおける最も重要なコンテナ型データ構造の一つであり、日常的なプログラミングからWeb開発まで、ほぼすべてのコードで活用されています。それだけ使用頻度が高いため、リスト操作をマスターすることは必須スキルといえます。本記事では、リストの要素を左または右に回転させる「ローテーション」処理を、3つの異なるアプローチで実装する方法を解説します。
方法1:スライスを使ったローテーション
最もシンプルでPythonらしいのがスライスを利用する方法です。回転数を n とした場合、左回転は「test_list[n:] + test_list[:n]」、右回転は「test_list[-n:] + test_list[:-n]」という形で簡潔に記述できます。
# スライスを使用したローテーション
# リストの初期化
test_list = [1, 4, 6, 7, 2]
# 元のリストを表示
print("Original list : " + str(test_list))
# スライスで3つ分だけ左回転
test_list = test_list[3:] + test_list[:3]
# 左回転後のリストを表示
print("List after left rotate by 3 : " + str(test_list))
# スライスで3つ分だけ右回転(元の並びに戻す)
test_list = test_list[-3:] + test_list[:-3]
# 右回転後のリストを表示
print("List after right rotate by 3(back to original) : " + str(test_list))
方法2:リスト内包表記を使ったローテーション
インデックスの計算過程を明示したい場合や、回転ロジックを柔軟にカスタマイズしたい場合は、リスト内包表記と剰余演算子(%)を組み合わせる方法が有効です。「(i + 3) % len(test_list)」のように要素位置をずらすことで、範囲を超えたインデックスも自動的に折り返してくれます。
# リスト内包表記を使用したローテーション
# リストの初期化
test_list = [1, 4, 6, 7, 2]
# 元のリストを表示
print("Original list : " + str(test_list))
# リスト内包表記で3つ分だけ左回転
test_list = [test_list[(i + 3) % len(test_list)]
for i, x in enumerate(test_list)]
# 左回転後のリストを表示
print("List after left rotate by 3 : " + str(test_list))
# リスト内包表記で3つ分だけ右回転(元の並びに戻す)
test_list = [test_list[(i - 3) % len(test_list)]
for i, x in enumerate(test_list)]
# 右回転後のリストを表示
print("List after right rotate by 3(back to original) : " + str(test_list))
方法3:collections.deque の rotate() を使ったローテーション
標準ライブラリ collections が提供する deque には、ローテーション専用の rotate() メソッドが用意されています。引数に正の値を渡すと右回転、負の値を渡すと左回転になります。deque は両端での要素追加・削除が高速に動作するため、大きなデータセットを頻繁に回転させたいケースで特に威力を発揮します。
# rotate() を使用したローテーション
from collections import deque
# リストの初期化
test_list = [1, 4, 6, 7, 2]
# 元のリストを表示
print("Original list : " + str(test_list))
# rotate() で3つ分だけ左回転
test_list = deque(test_list)
test_list.rotate(-3)
test_list = list(test_list)
# 左回転後のリストを表示
print("List after left rotate by 3 : " + str(test_list))
# rotate() で3つ分だけ右回転(元の並びに戻す)
test_list = deque(test_list)
test_list.rotate(3)
test_list = list(test_list)
# 右回転後のリストを表示
print("List after right rotate by 3(back to original) : " + str(test_list))
実行結果
上記の3つの方法はいずれも、まったく同じ結果を出力します。左に3回転すると先頭の3要素が末尾へ移動し、さらに右に3回転すると元の順序に戻ることが確認できます。
Original list : [1, 4, 6, 7, 2] List after left rotate by 3 : [7, 2, 1, 4, 6] List after right rotate by 3(back to original) : [1, 4, 6, 7, 2] Original list : [1, 4, 6, 7, 2] List after left rotate by 3 : [7, 2, 1, 4, 6] List after right rotate by 3(back to original) : [1, 4, 6, 7, 2] Original list : [1, 4, 6, 7, 2] List after left rotate by 3 : [7, 2, 1, 4, 6] List after right rotate by 3(back to original) : [1, 4, 6, 7, 2]
まとめ
スライスはコードが短く直感的で、小規模なリストに最適です。リスト内包表記はインデックス制御を伴う複雑な変換にも応用しやすい汎用性が魅力です。collections.deque は専用メソッドにより可読性が高く、パフォーマンス面でも優れているため、大規模データや頻繁な回転処理に向いています。用途に応じてこれらを使い分けることで、より効率的で保守性の高い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
-
Pythonで辞書のリストを値でソートする方法|sorted関数とlambdaの使い方
本記事では、複数の辞書を格納したリストを、各辞書が持つ値(value)に基づいて並べ替える方法を解説します。 サンプルとして使う辞書には、「name(名前)」と「roll(出席番号)」という2つのキーが含まれています。まずはPythonの組み込み関数 sorted() とラムダ式(lambda)を組み合わせて、roll の値で昇順にソートした結果を表示します。 続いて、name と roll の両方を組み合わせた条件でのソート、そして roll の値で降順にソートする方法まで、順番に見ていきましょう。 サンプルコード # 辞書のリストを初期化 my_list1 = [{ name : A