【Python】リスト結合の方法を初心者向けにわかりやすく解説

はじめに

みなさんはPythonでリストを扱うとき、複数のリストを一度にまとめたり、要素を効率よく追加したりしたいと思ったことはないでしょうか。
実際の開発現場や学習において、複数のデータをまとめて処理したいケースはよくあります。
例えばデータ分析で複数のデータセットを結合するときや、Webアプリケーションでユーザー入力を取りまとめて管理するときなどが挙げられます。

Pythonにはリスト結合をするための多様な方法があります。
この記事では、初心者の方が「どうやってリストを結合すればいいのだろう?」と迷わないように、Python リスト 結合について基本から応用的な使い方までを細かく解説していきます。

この記事を読むとわかること

  • リスト結合の概要
  • 代表的なリスト結合の方法 (+演算子、extendメソッドなど)
  • 実務での活用事例 (データ分析やWebアプリケーションなど)
  • Pythonicな書き方や使い分けのポイント
  • 結合にまつわる注意点 (ミュータブルな操作やパフォーマンスなど)

リスト結合とは何か

まずはリスト結合の定義について確認してみましょう。
Pythonでリスト同士をくっつける処理を総称して「リスト結合」と呼ぶことがあります。
例えば [1, 2, 3][4, 5, 6] をひとつのリスト [1, 2, 3, 4, 5, 6] にするような操作が典型例です。

実務ではデータ集約という形で登場することが多いです。
例えばECサイトの在庫管理において「商品Aの在庫リスト」と「商品Bの在庫リスト」を合体させるケースが考えられます。
一括で検索・集計したい場合、リストを結合してから繰り返し処理やフィルタリングを行うと扱いやすくなるでしょう。

プログラミング初心者の方は、「リストに要素を追加する場合はappend」という発想になりがちです。
もちろん append も有効ですが、リストを結合するにはさらに便利な方法があります。
この記事を読むことで、その具体的な方法を整理しておきましょう。

リスト結合の代表的な方法

+演算子で結合する

もっともシンプルな方法としては、+演算子を使ったリストの結合があります。
これはふたつのリストをまるで文字列のように足し合わせるイメージです。

numbers1 = [1, 2, 3]
numbers2 = [4, 5, 6]
combined = numbers1 + numbers2
print(combined)  # [1, 2, 3, 4, 5, 6]

このコードでは、numbers1numbers2 を足し合わせると、新しいリスト combined が得られます。
ただし覚えておいてほしい点として、元のリストnumbers1numbers2自体は変化しないということがあります。

+演算子は直感的に使いやすい反面、処理のたびに新しいリストを生成します。
要素数が非常に大きい場合は、余計なメモリを消費する可能性がありますので注意してください。

extendメソッドを使う

次に紹介するのはextendメソッドです。
これはリストのメソッドとして定義されていて、リストの末尾にもう一方のリストの要素をまとめて追加します。

numbers1 = [1, 2, 3]
numbers2 = [4, 5, 6]

numbers1.extend(numbers2)
print(numbers1)  # [1, 2, 3, 4, 5, 6]

numbers1 が直接書き換わり、[1, 2, 3, 4, 5, 6] という形で更新されます。
メモリの使用効率や速度面で、+演算子よりもこちらを好んで使うケースが少なくありません。
特に実務で大規模データを扱う場合は、extend の方が無駄が少ないことが多いです。

appendメソッドに注意

初心者の方が混同しがちなメソッドにappendがあります。
appendはリストに要素をひとつずつ追加するメソッドですが、リスト同士の結合とはやや異なる挙動をします。

numbers1 = [1, 2, 3]
numbers2 = [4, 5, 6]

numbers1.append(numbers2)
print(numbers1)  # [1, 2, 3, [4, 5, 6]]

ここでは numbers2 が一つの要素として numbers1 に追加されたため、ネストされたリストになってしまいます。
つまり、appendは「リストをまとめて結合する」というより「1つのオブジェクトとして追加する」イメージです。

リスト結合が目的であれば、append の代わりに extend を使う方が自然です。
appendの使い方自体が間違いというわけではありませんが、想定する挙動を間違えやすいので意識しておきましょう。

実務での活用事例

データ分析で複数のリストをまとめる

データ分析の現場では、いくつかの系列データや結果リストを合体させて、まとめて処理することがあります。
例えばA/Bテストの結果を、それぞれ別々のリストで持っていたとします。
片方は [120, 130, 125] などの値、もう片方は [115, 140, 128] のようなデータが格納されているかもしれません。

これらを一括で集計するためにリストを結合すれば、ループを1回にまとめられますし、平均値や最小値・最大値といった集計処理も分かりやすくなります。
最終的に結合後のリストを使ってグラフを描画するといった流れはよくあるパターンです。

Webアプリケーションで入力データを連結

フォームから送信されたユーザー入力を管理する場合にも、リストを結合する場面が登場します。
例えばユーザーからのフィードバックを日別のリストとして管理している場合をイメージしてください。
その日のうちに3件、新しいフィードバックがあれば、それを既存のリストに結合することで集計や解析に利用できます。

extendによって実行時にリストを更新しておけば、過去データと一括で処理できるため、データの管理がシンプルになるでしょう。

リスト結合とパフォーマンス

+演算子とextendの違い

すでに触れましたが、+演算子は新しいリストを作り出すのに対し、extendは既存のリストを直接更新する仕組みです。
大きなリストを何度も + で結合すると、その都度新たなリストを生成するため、メモリ効率が低下するおそれがあります。

たとえば100万件の要素を持つリストを扱うと想定すると、+演算子のたびに巨大なリストを再作成するのは負荷が高いです。
こういう場面では、extend を使うことが多くなります。
もし高速化やメモリ使用量が気になる場合は、なるべく extend を選択しましょう。

頻繁に結合が必要な場合

大量のデータを繰り返し結合して最終的なリストを作る場合、Pythonのリスト以外のデータ構造を検討することもあります。
例としては collections.deque やジェネレータを使うアプローチなどです。
ただ、そこまで踏み込む前に、まずは extend を中心に使ってみるのが自然です。
多くのケースで問題なくカバーできるはずです。

他のリスト結合手段

itertools.chain

大規模な処理で、リスト同士を一時的に扱いたいだけという場合は、itertools.chain が便利です。
chain は引数に与えられた複数のイテラブルを連結して、ひとつのイテレータとして扱うことができます。

import itertools

numbers1 = [1, 2, 3]
numbers2 = [4, 5, 6]

for num in itertools.chain(numbers1, numbers2):
    print(num)

ここでは、新たにリストを生成することなく要素を順番に取り出せます。
必要なときだけイテレータを使うため、メモリ使用を抑えた処理が可能です。
ファイルから読み込んだデータを複数まとめて処理したり、部分的な合体を一括ループで扱いたいときに役立ちます。

リスト内包表記で結合する

あまり一般的ではありませんが、リスト内包表記で結合するテクニックも存在します。
例えば次のように書けば、ふたつのリストをまとめて新しいリストを一度に作ることが可能です。

numbers1 = [1, 2, 3]
numbers2 = [4, 5, 6]

combined = [x for x in numbers1] + [y for y in numbers2]
print(combined)  # [1, 2, 3, 4, 5, 6]

これは結局 +演算子と大差ない動作です。
しかし、さらに条件付きで要素を追加したい場合には、内包表記を活用できるメリットがあります。
ただ実務では、単にリストを結合するだけならここまでややこしい書き方をする必要はほとんどありません。

結合したリストを使った実務シーン

商品データの一括出力

ECサイトなどの在庫管理システムを考えたとき、例えば日次で取得している在庫リストが複数に分かれているかもしれません。
日毎に別ファイルとして管理しているようなケースです。
それらを日付別に読み込み、合体させて全体の在庫リストを作ってしまえば、欠品商品の確認や販売数の予測など、一括処理がシンプルになります。

このとき、Pythonでファイルから読み込んだ要素をリストで保持し、extend を使って一つの大きなリストにまとめます。
そのうえで在庫数をループ処理で合計すれば、データの俯瞰が容易になるでしょう。

複数のログファイルの一括解析

Webアプリケーションのアクセスログをリストとして読み込むシステムをイメージしてみましょう。
ログファイルが複数に分かれているとき、1つずつ処理してもいいのですが、まとめてリストに結合すれば、同じ処理を1回で済ませられるかもしれません。

例えば異なるWebサーバーから送られたログを1つの解析ツールに取りまとめて食わせるといった運用が考えられます。
結合後のリストを使えば、集計や可視化ツールへの入力がスムーズになるでしょう。

辞書やタプルとの組み合わせ

リストの要素としてタプルを格納

実務では、単に数字や文字列だけでなく、タプルや辞書をリストに格納することが多々あります。
例えば (商品ID, 在庫数) といった形式のタプルをリストで持っていたり、ユーザープロファイルを辞書で管理していたりするケースです。

リストにタプルや辞書を含んでいても、結合の方法は基本的に変わりません。
extend や +演算子でまとめれば、複数のリストをまとめることができます。
ただし append と間違えて使うと、ネスト構造が深くなってしまうので注意してください。

リストの要素として辞書を格納

ユーザー情報や製品の情報を辞書で管理している場合もあるかもしれません。
例えば {"name": "Alice", "age": 25} のような辞書が複数集まっている場合、それらをリストにまとめることは一般的です。
リスト結合を通じて複数のユーザー情報をひとつに集約すれば、後の処理をシンプルに書けるはずです。

エラーパターンと対処法

リスト以外をextendしようとしてしまう

例えば数字そのものや文字列など、リスト以外のオブジェクトを extend に渡すとエラーになる可能性があります。
extend はイテラブルなオブジェクトが渡されることを想定しているので、そうでない場合は例外が発生します。

たとえば以下のようなコードはエラーになります。

numbers = [1, 2, 3]
value = 4
numbers.extend(value)  # TypeError: 'int' object is not iterable

この場合は append(value) のように書き換えるのが正解です。
「リスト結合したいのか、それともひとつの値を追加したいのか?」を明確に区別しましょう。

リスト以外のシーケンスでも同様の挙動がある

タプルや文字列など、イテラブルオブジェクトを extend すると、要素が展開されてリストに追加されます。
これは誤って文字列を extend すると、一文字ずつ追加されてしまう原因にもなるため、思わぬバグを招くかもしれません。

chars = ['a', 'b']
chars.extend("cd")
print(chars)  # ['a', 'b', 'c', 'd']

これは意図的にやるならOKですが、単に "cd" という文字列をまとめて入れたかっただけなら append("cd") が正しい場面もあります。
こういった挙動の違いをあらかじめ認識しておくと、バグを減らせるでしょう。

Pythonicな書き方のポイント

Pythonでは「可読性の高いコードを書く」という文化が大切にされています。
リスト結合もシンプルに書けるので、むやみに複雑な構文を使わず、意図が伝わりやすい方法を選びたいところです。

  1. 結合する場合はextendか+を使う
  2. 1つの要素として追加したい場合はappendを使う
  3. イテレータとして連結したいだけならitertools.chainを検討する

こういった基本方針を守ると、チーム開発でも迷いにくくなります。
意図が明確になり、後からコードを読む人にとってもわかりやすいでしょう。

リストを結合する際は、エラーを避けるためにも「extendすべき場面とappendすべき場面」をあらかじめ見極めておくと便利です。

よくある質問と回答

Q. appendとextendはどちらがよいか?

A. 場合によります。

  • append は「ひとつの要素」として追加したいときに使う
  • extend は「要素をまとめて結合したい」ときに使う

想定しているリストの構造によって正解が異なるため、必要に応じて使い分けましょう。

Q. 大規模データを結合する場合はどうする?

A. 頻繁にリスト結合が発生するなら、extend を選ぶか、あるいは itertools.chain などのイテレータで処理する方法を検討します。
複数のリストを単に合体させたいだけなら extend
一方で合体後にすべての要素にすぐアクセスする必要がなく、繰り返し処理で1要素ずつ処理していける場合は itertools.chain がメモリ的に効率的です。

Q. リストを+演算子で結合するとパフォーマンスに影響がありますか?

A. あります。
+演算子による結合は新たなリストを生成するため、要素数が大きい場合はメモリ負荷が高まります。
大規模データを扱うときは extend を検討するとよいでしょう。

リスト結合を活用したサンプルコード

ここではリスト結合を活用して、複数の顧客情報をまとめて処理する簡単な例を示します。
たとえば、顧客リストを月ごとに管理しているけれど、年度ごとに集計したいというケースを想定してください。

# 月毎に分かれた顧客リストを例として用意
january_customers = ["Alice", "Bob"]
february_customers = ["Charlie", "Diana"]
march_customers = ["Eve", "Frank"]

# 全リストをまとめて年度リストに結合
all_customers = []
all_customers.extend(january_customers)
all_customers.extend(february_customers)
all_customers.extend(march_customers)

print("年度合計のお客様リスト:", all_customers)

# 全リストを一括でループ処理可能になる
for customer in all_customers:
    print("Hello,", customer)

このように、最初に空リスト all_customers を用意して extend を連続的に呼び出し、全顧客データをまとめています。
こうすることで、ひとつのループで年度合計の顧客情報に対して、あいさつ処理などをまとめて行うことができるようになります。

また、itertools.chain を使えば以下のようにも書けます。
一括で回すだけなら、一時的に大きなリストを作らなくて済むので、メモリを抑えたい場合に便利です。

import itertools

january_customers = ["Alice", "Bob"]
february_customers = ["Charlie", "Diana"]
march_customers = ["Eve", "Frank"]

for customer in itertools.chain(january_customers, february_customers, march_customers):
    print("Hello,", customer)

用途に応じて好きな方法を選べばOKです。

結合後に要素を加工する方法

リストを結合してからフィルタリング

実際の開発ではリストを結合した後に何らかの条件で要素を絞り込むことが多いです。
たとえば数値リストの場合、以下のようにリスト結合後にフィルタリングが可能です。

list_a = [100, 120, 90]
list_b = [60, 130, 140]

# extendで合体
list_a.extend(list_b)

# 100以上の値だけ抽出
filtered = [x for x in list_a if x >= 100]
print(filtered)  # [100, 120, 130, 140]

こうした「結合 → 加工 → 集計」という流れはデータ処理の常套手段です。
リスト結合を覚えておくと、さまざまなユースケースに対応できるでしょう。

結合後にソートする

結合したリストを昇順や降順に並び替えてから利用したいケースもあります。
特に数値データや文字列でもアルファベット順に並べ替える要望はよくあります。

list_a = [5, 1, 3]
list_b = [2, 4]

merged_list = list_a + list_b
merged_list.sort()
print(merged_list)  # [1, 2, 3, 4, 5]

このように sort() で順序を整えることが可能です。
拡張的な使い方として、キーを指定してソートすることもよくありますが、まずはシンプルに結合と合わせて習得しておくと便利です。

注意点とまとめ

リストの結合方法を間違えると、思わぬバグやパフォーマンス問題が生じる場合があります。 +演算子は新しいリストを生成する、extendは既存のリストを書き換えるなど、違いを理解してうまく使い分けましょう。

この注意点を踏まえれば、実務におけるリスト操作がスムーズになります。

まとめ

Python リスト 結合には、+演算子や extenditertools.chain など実にさまざまな方法があります。
目的やデータ量、メモリ事情によって、使うべき手段が変わるのがポイントです。

+演算子は直感的に理解しやすい反面、新たなリストを作るため大規模データには向きにくいです。
extend は既存のリストを直接書き換えるので、リソース効率や可読性に優れます。
一時的に結合してループ処理したいだけであれば、イテレータを返す itertools.chain が有力な選択肢となることも覚えておきましょう。

初心者のうちに「appendは1要素追加、extendはリスト結合」という区別をはっきり身につけると、後のプログラミングがずっと楽になります。
データ分析やWeb開発、システム運用など、幅広い実務シーンで役立つ知識ですので、ぜひ日頃のコードでも積極的に活用してみてください。

Pythonをマスターしよう

この記事で学んだPythonの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。