リスト(list)

【Python】リスト(list)内包表記の使い方

【Python】リスト(list)内包表記の使い方

Pythonのリスト内包表記(list comprehension)の使い方について解説します。

リスト内包表記(list comprehension)

Pythonにおけるリスト内包表記(list comprehension)は、既存リスト等のイテラブル(iterable)なオブジェクトから新たなリストを作成する際にシンプルに記載するための定義方法のことを言います。

本記事では、リスト内包表記の基本的な使い方について紹介します。

Note

イテラブル(iterable)なオブジェクトとは反復可能なオブジェクトでリスト(list)、タプル(tuple)、辞書(dict)等が代表的なものになります。また、__iter__()メソッドかもしくは__getitem__()メソッドを持つ任意のクラスのオブジェクトもfor文の繰り返しで使用することができます。

イテラブル(iterable)に関する公式ドキュメントの説明はこちらを参照してください。

リスト内包表記の使い方

リスト内包表記の構文は以下になります。

リスト内包表記
[式 for 仮変数 in イテラブルなオブジェクト if 条件]

上記の意味合いとしては、”イテラブルなオブジェクト”から要素を順番に”仮変数”に取得し、”条件”に一致するものに対して”式”を適用した値でリストを作るということになります。

なかなか文章で書いても実感がわかないと思いますので、以降で簡単な例を使ってリスト内包表記の使い方を確認しましょう。

リスト内包表記を使う場合

以下の例を用いてリスト内包表記の使い方を説明します。

# dataの中で、2で割り切れる数値のみを取り出してnew_dataを作成する。
# リスト内包表記を使って記載する方法
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
new_data = [i for i in data if i % 2 == 0]
print(f"new_data: {new_data}")
【実行結果】
new_data: [2, 4, 6, 8, 10]

上記例では、既に作成してあるdataという数値リストの中から2で割り切れる数値のみを取り出してnew_dataという新しいリストを作っています。もちろん条件等は目的に合わせて変更することが可能です。

リスト内包表記を使用しないで記載する場合

リスト内包表記を使用しない形でプログラムを記述することももちろん可能です。上記例をリスト内包表記を使わずに記載すると以下のようになります。

# リスト内包表記を使用しない場合の記載方法
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
new_data = []

for i in data:
    if i % 2 == 0:
        new_data.append(i)
print(f"new_data: {new_data}")
【実行結果】
new_data: [2, 4, 6, 8, 10]

複数リストからリスト内包表記を用いてリストを作成する方法

リスト内包表記は、複数リストを使って新しいリストを作成する場合にも使用可能です。

リスト内包表記を使う場合

以下の例を用いて、複数リストに対してリスト内包表記を使う方法を説明します。

# 複数のリストから新しいリストを作成する。
# リスト内包表記を用いる
data1 = [1, 2, 3, 4, 5]
data2 = [11, 12, 13, 14, 15]
new_data = [i * j for i in data1 if i % 2 == 0 for j in data2 if j % 2 == 0]

print(f"new_data: {new_data}")
【実行結果】
new_data: [24, 28, 48, 56]

上記例では、2つリストから2で割り切れる数値を取り出し、掛け合わせた値で新しいリストを作成しています。

リスト内包表記を使用しないで記載する場合

上記の例をリスト内包表記を使用せずに記載すると以下のようになります。

# リスト内包表記を使用しない場合の記載方法
data1 = [1, 2, 3, 4, 5]
data2 = [11, 12, 13, 14, 15]
new_data = []

for i in data1:
    if i % 2 == 0:
        for j in data2:
            if j % 2 == 0:
                new_data.append(i * j)
print(f"new_data: {new_data}")
【実行結果】
new_data: [24, 28, 48, 56]

リスト内包表記を積極的に使用するべき理由と注意点

上記でリスト内包表記の基本的な使い方を紹介しました。

例を見てみると、リスト内包表記はシンプルに記載ができていることが分かったかと思います。また、リスト内包表記は、リスト内包表記を使用しない記載方法よりも処理速度が速いという特徴があるため、積極的に使用するように意識するとよいでしょう。

ただし、注意点として複数リストから作成する場合や条件が複雑な場合には、必ずしもリスト内包表記を採用するべきではありません。

チームでの開発等をしている場合には、チームメンバーの他の人もソースを読むことになるため、読みやすく内容を理解しやすいように可読性を意識したコードを書くことが重要です。リスト内包表記を使うことでコードが複雑になってしまう恐れがある場合には、リスト内包表記を使用するべきかよく検討するようにしましょう。

まとめ

Pythonのリスト内包表記(list comprehension)の使い方について解説しました。

リスト内包表記は、既存リスト等のイテラブル(iterable)なオブジェクトから新たなリストを作成する際にシンプルに記載するための定義方法のことです。

リスト内包表記を用いるとシンプルな記載ができる上に、処理速度が高速であるという特徴があります。一方で、複数リストから作成する場合や条件が複雑な場合には、可読性が悪くなり、読みにくくなってしまうこともあるため、複雑なケースでは使用するべきかよく検討しましょう。

Pythonにおける内包表記は他にも「辞書内包表記」「集合内包表記」「ジェネレータ内包表記」といった種類のものがあります。内包表記については、「内包表記(まとめ)」にまとめていますので興味があれば参考にしてください。