Pythonにおいて、特定の初期値を持つリストを作成したり、決まったパターンの繰り返し配列を生成したりする場合、* 演算子(乗算演算子)を使用するのが最もPythonらしい簡潔な記述(Pythonic)です。
for文を使用せずに、効率的にリストを展開・初期化する手法を解説します。
目次
解決したい課題
リストの初期化において、「すべての要素を0にする」「特定のパターン(A, B, C)をN回繰り返す」といった操作を行いたい場面があります。これをループ処理で記述するとコードが冗長になるため、演算子を活用して一行で記述します。
実装例:週間シフトパターンの生成
ここでは、1日ごとの基本シフトパターン(早番、遅番、夜勤)を定義し、それを1週間分(7日分)繰り返した大きなリストを作成するシナリオを想定します。
ソースコード
# 1日分の基本シフト構成
# 文字列のリストとして定義
daily_pattern = ["Early", "Late", "Night"]
# 1週間(7日分)のスケジュール枠を一括生成
# [リスト] * [整数] とすることで、リストの中身がその回数分連結されます
weekly_schedule = daily_pattern * 7
# 結果の確認
print(f"合計シフト枠数: {len(weekly_schedule)}")
print("--- 生成されたリスト ---")
print(weekly_schedule)
実行結果
合計シフト枠数: 21
--- 生成されたリスト ---
['Early', 'Late', 'Night', 'Early', 'Late', 'Night', 'Early', 'Late', 'Night', 'Early', 'Late', 'Night', 'Early', 'Late', 'Night', 'Early', 'Late', 'Night', 'Early', 'Late', 'Night']
解説
リストの乗算
リストに対して整数 N を乗算すると、元のリストの要素が N 回繰り返された新しいリストが生成されます。
- 単一要素の繰り返し:
[0] * 5→[0, 0, 0, 0, 0]- 配列の初期化(ゼロ埋めなど)で頻繁に使用されます。
- パターンの繰り返し:
["A", "B"] * 3→["A", "B", "A", "B", "A", "B"]- 今回の例のように、シーケンス自体を繰り返す際に有効です。
注意点:参照のコピー
この手法で作成される要素は「浅いコピー(Shallow Copy)」となります。 数値や文字列のようなイミュータブル(変更不可)なオブジェクトの場合は問題ありませんが、リストの中にさらにリストを入れる場合(例:[[]] * 3)は、内部のリストがすべて同一のオブジェクトを参照してしまうため注意が必要です。多次元配列の初期化には内包表記の使用が推奨されます。
