Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのリスト内包表記とは?基本構文から実践例までわかりやすく解説

Pythonには、あるリストから別のリストを生成するための簡潔な構文が用意されています。これらの式は「リスト内包表記(List Comprehensions)」と呼ばれ、Pythonにおける最も強力な機能の一つです。リスト内包表記は、Pythonが関数型プログラミングの概念をサポートしている好例でもあります。

リスト内包表記を使うと、関数やフィルタ処理をリストの各要素に簡単に適用できます。正しく使えば非常に便利ですが、使い方を誤るとかえって読みにくいコードになってしまうため注意が必要です。

基本構文

リスト内包表記の一般的な構文は以下の通りです。

[expr for element in iterable if condition]

この式は、次のforループと同等の意味を持ちます。

for element in iterable:
    if condition:
        expr

例えば、リスト内の各数値の二乗を計算したい場合を考えてみましょう。計算内容を表す式と、繰り返し処理の対象となる入力シーケンスを指定するだけで実現できます。

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> squares = [x**2 for x in lst]
>>> print(squares)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

リスト内包表記とforループの比較

まず、従来のforループを使ったコードを見てみましょう。

# forループを使用した場合
evens = []
for i in range(10):
    if i % 2 == 0:
        evens.append(i)
print(evens)

出力結果

[0, 2, 4, 6, 8]

上記のコードは、リスト内包表記を使うことで、より簡潔かつ高速に書き換えられます。

>>> [i for i in range(10) if i % 2 ==0]
[0, 2, 4, 6, 8]

ご覧の通り、リスト内包表記を使えばコードが短くなり、記述する要素も減るため、はるかに効率的です。

リスト内包表記とlambda関数・map()の比較

単一引数の関数を適用する場合を除き、単純なケースではリスト内包表記の方が組み込み関数map()よりも明快です。map()では計算のためにlambda関数を作成する必要があり、コードが視覚的に煩雑になりがちです。

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(map(lambda x: x**2, lst))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

さらに、map()と異なり、リスト内包表記では入力リストから条件に合わない要素を簡単に除外(フィルタリング)できる点も大きな利点です。

条件式を使ったリスト内包表記

例えば、「100未満の数値のうち、2と5の両方で割り切れる数」だけを求めたい場合は、if条件を重ねることで実現できます。

>>> lst = [x for x in range(100) if x % 2 == 0 if x % 5 == 0]
>>> print(lst)
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

もう一つ例を挙げます。「2で割り切れる数だけの二乗」を計算したい場合は、for句の後に条件式を追加します。

>>> lst=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> even_squares = [x**2 for x in lst if x % 2 == 0]
>>> print(even_squares)
[4, 16, 36, 64, 100]

1から100までの間の偶数を求めるコードは次のようになります。

>>> # 1〜100の間の偶数のリスト
evens = [i for i in range(1,100) if not i % 2]
>>> print(evens)
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98]

まとめ

大量の要素を繰り返し処理する場合、リスト内包表記はforループよりもはるかに高速です。可読性の高さだけでも積極的に使う価値がありますが、処理速度の面でも大きなメリットがあります。ぜひ日々のコーディングに取り入れてみてください。

  1. Pythonの内包表記(Comprehension)とは?リスト・辞書・セット・ジェネレータの使い方を解説

    Pythonでは、既存のシーケンスをもとにして新しいシーケンスを作成できます。この手法は「内包表記(Comprehension)」と呼ばれます。内包表記とは、別のシーケンスを使用して、リスト・辞書・セット・ジェネレータといった新しいシーケンスを生成するための、簡潔なコードの書き方です。異なる型のシーケンス間で複数段階の変換を行うことも可能です。 リスト内包表記(List Comprehension) リスト内包表記では、既存のリストの値を加工しながら新しいリストを作成します。以下の例では、与えられたリストの各要素に3を加算した新しいリストを生成しています。 例 given_list = [x

  2. Python入門:リストスライスとリスト内包表記の基本を徹底解説

    この記事では、Pythonにおけるリストスライス(list slicing)とリスト内包表記(list comprehension)について、初心者にもわかりやすく解説します。リストスライスとは?「スライス」という言葉は、文字通り「何かを小さく切り分ける」という意味です。リストスライスとは、元のリストから一部分だけを取り出す処理のことを指します。どこから切り出すか(開始位置)、どこで止めるか(終了位置)、どの間隔で切り出すか(ステップ数)を自由に指定できるのが特徴です。リスト内包表記とは?リスト内包表記は、既存のリストをもとに新しいリストを生成するための記法です。forループや条件式を1行にま