Pythonで複数のリストを一つにまとめる際、主に + 演算子を使用する方法と、リストオブジェクトの extend メソッドを使用する方法の2通りがあります。
これらは「結合する」という結果は同じですが、**元のリストを変更するかどうか(破壊的か非破壊的か)**という点で挙動が大きく異なります。それぞれの特性を理解し、適切に使い分ける方法を解説します。
目次
解決したい課題
例えば、部署ごとの社員リストを統合して全社リストを作成したい場合や、既存のデータセットに追加データを結合したい場合があります。元のデータを残すべきか、メモリ効率を優先して直接書き換えるかによって手法を選択します。
実装例:プロジェクトメンバーの統合
ここでは、「開発チーム」と「運用チーム」のメンバーリストを結合するシナリオで、2つの方法の違いを実演します。
ソースコード
# 1. + 演算子を使用した結合(非破壊的)
# 元のリストはそのままで、新しいリストを作成します
dev_team = ["Alice", "Bob"]
ops_team = ["Charlie", "Dave"]
# 2つのリストを結合して新しいリスト 'project_members' を作成
project_members = dev_team + ops_team
print("--- + 演算子の結果 ---")
print(f"Dev Team (変更なし): {dev_team}")
print(f"Ops Team (変更なし): {ops_team}")
print(f"Project Members : {project_members}")
# 2. extend メソッドを使用した結合(破壊的)
# 元のリスト自体を変更(拡張)します
core_members = ["Eve", "Frank"]
new_joiners = ["Grace", "Heidi"]
print("\n--- extend メソッド実行前 ---")
print(f"Core Members: {core_members}")
# core_members 自体に new_joiners の内容を追加
core_members.extend(new_joiners)
print("--- extend メソッド実行後 ---")
print(f"Core Members (変更あり): {core_members}")
# new_joiners 自体は影響を受けません
print(f"New Joiners : {new_joiners}")
実行結果
--- + 演算子の結果 ---
Dev Team (変更なし): ['Alice', 'Bob']
Ops Team (変更なし): ['Charlie', 'Dave']
Project Members : ['Alice', 'Bob', 'Charlie', 'Dave']
--- extend メソッド実行前 ---
Core Members: ['Eve', 'Frank']
--- extend メソッド実行後 ---
Core Members (変更あり): ['Eve', 'Frank', 'Grace', 'Heidi']
New Joiners : ['Grace', 'Heidi']
解説
1. + 演算子による結合
- 挙動:
list_a + list_bは、両方の要素を含む新しいリストを作成して返します。 - 特徴: 元のリスト(
list_a,list_b)は変更されません。 - 用途: 元のデータを保持したまま、結合後のデータも別個に扱いたい場合に使用します。
2. extend() メソッドによる結合
- 挙動:
list_a.extend(list_b)は、list_aの末尾にlist_bの要素を順番に追加します。 - 特徴:
list_a自体が書き換えられます(インプレース処理)。戻り値はありません(None)。 - 用途: 元のリストを更新したい場合や、巨大なリストを扱う際に新しいリストを作成するメモリコストを抑えたい場合に使用します。
