Python リスト内包表記とは?書き方・使い方を初心者向けに解説

Pythonのリスト内包表記は、リストを効率よく作成するための書き方です。

通常のfor文を使った処理を、より短くシンプルに記述できます。

この記事では、Python初心者向けにリスト内包表記の基本から、ifを使った条件指定、通常のfor文との違いまでわかりやすく解説します。

Pythonのリスト内包表記とは

リスト内包表記(List Comprehension)とは、リストを作成する処理を1行で記述するための書き方です。

例えば、0から4までの数字をリストにする場合、通常のfor文では次のように書きます。

numbers = []

for i in range(5):
    numbers.append(i)

print(numbers)

実行結果:

[0, 1, 2, 3, 4]

これをリスト内包表記で書くと、次のようになります。

numbers = [i for i in range(5)]

print(numbers)

実行結果は同じです。

[0, 1, 2, 3, 4]

リスト内包表記を使うことで、リストを作成する処理を短く書けます。

Pythonのリスト内包表記の基本構文

リスト内包表記の基本的な構文は次のとおりです。

[式 for 変数 in 繰り返し可能なオブジェクト]

例えば、次のコードがあります。

numbers = [i for i in range(5)]

それぞれの部分には、次の意味があります。

部分 意味
i リストに入れる値
for i iを順番に取り出す
in range(5) 0~4を繰り返す

「何をリストに入れるのか」を最初に書き、その後ろにfor文を書くと考えると理解しやすいでしょう。

リスト内包表記で計算する

リスト内包表記では、取り出した値を計算してからリストに入れることもできます。

例えば、0~4をそれぞれ2倍してみます。

numbers = [i * 2 for i in range(5)]

print(numbers)

実行結果:

[0, 2, 4, 6, 8]

通常のfor文なら次のようになります。

numbers = []

for i in range(5):
    numbers.append(i * 2)

リスト内包表記では、i * 2をそのままリストに入れる値として指定できます。

リスト内包表記で文字列を処理する

リスト内包表記は、文字列の処理にも利用できます。

例えば、文字列のリストをすべて大文字に変換します。

words = ["apple", "banana", "orange"]

result = [word.upper() for word in words]

print(result)

実行結果:

['APPLE', 'BANANA', 'ORANGE']

このように、リストの各要素に対して同じ処理を行いたい場合に便利です。

リスト内包表記でif条件を使う

リスト内包表記では、ifを使って条件に合う要素だけを取り出すこともできます。

基本構文は次のとおりです。

[式 for 変数 in リスト if 条件]

例えば、1~10の中から偶数だけを取り出します。

numbers = [i for i in range(1, 11) if i % 2 == 0]

print(numbers)

実行結果:

[2, 4, 6, 8, 10]

i % 2 == 0は、「iを2で割った余りが0」という意味です。

つまり、偶数だけをリストに追加しています。

リスト内包表記で奇数を取り出す

奇数だけを取り出すこともできます。

numbers = [i for i in range(1, 11) if i % 2 == 1]

print(numbers)

実行結果:

[1, 3, 5, 7, 9]

このように、ifを組み合わせることで、条件に合ったデータだけを新しいリストにできます。

リスト内包表記でif elseを使う

条件によってリストに入れる値を変えることもできます。

この場合は、ifとelseを式の中に書きます。

[値1 if 条件 else 値2 for 変数 in リスト]

例えば、数字が偶数なら「偶数」、奇数なら「奇数」という文字列にします。

numbers = [1, 2, 3, 4, 5]

result = ["偶数" if i % 2 == 0 else "奇数" for i in numbers]

print(result)

実行結果:

['奇数', '偶数', '奇数', '偶数', '奇数']

通常のfor文とリスト内包表記の違い

例えば、1~5の数字を2倍する処理を比較してみましょう。

通常のfor文:

numbers = []

for i in range(1, 6):
    numbers.append(i * 2)

リスト内包表記:

numbers = [i * 2 for i in range(1, 6)]

リスト内包表記のほうが短く書けます。

ただし、短ければ必ず良いというわけではありません。

処理が複雑になる場合は、通常のfor文を使ったほうが読みやすいこともあります。

ネストしたfor文もリスト内包表記にできる

リスト内包表記では、複数のforを組み合わせることもできます。

例えば、次のような二重ループがあります。

result = []

for x in [1, 2, 3]:
    for y in [10, 20]:
        result.append(x + y)

print(result)

実行結果:

[11, 21, 12, 22, 13, 23]

これをリスト内包表記にすると次のようになります。

result = [x + y for x in [1, 2, 3] for y in [10, 20]]

print(result)

ただし、forが増えるほどコードが読みにくくなる場合があります。

初心者のうちは、まず1つのforを使ったリスト内包表記を理解することをおすすめします。

リスト内包表記を使うときの注意点

リスト内包表記は便利ですが、何でもリスト内包表記にすればよいわけではありません。

例えば、複雑な処理を無理に1行にすると、かえってコードが読みにくくなります。

次のようなコードは、通常のfor文や関数に分けたほうが理解しやすい場合があります。

result = [x * 2 if x > 10 else x + 5 if x > 5 else x for x in numbers]

「短く書くこと」より「読みやすく書くこと」を優先しましょう。

リスト内包表記とmap関数の違い

リストの各要素に同じ処理を行う場合、map()を使う方法もあります。

例えば、数字を2倍にします。

numbers = [1, 2, 3, 4, 5]

result = list(map(lambda x: x * 2, numbers))

リスト内包表記なら次のように書けます。

result = [x * 2 for x in numbers]

Pythonでは、単純なデータ変換であればリスト内包表記のほうが読みやすいケースもあります。

リスト内包表記の覚え方

初心者は、次の形をまず覚えるとよいでしょう。

[処理する値 for 変数 in リスト]

例えば、

[x * 2 for x in numbers]

なら、

「numbersからxを1つずつ取り出して、x × 2をリストにする」

と考えます。

条件を付ける場合は、

[処理する値 for 変数 in リスト if 条件]

です。

例えば、

[x * 2 for x in numbers if x > 10]

なら、

「numbersからxを取り出し、xが10より大きい場合だけx×2をリストにする」

という意味です。

関連記事

近いテーマの記事です。あわせてどうぞ。

Pythonのリスト内包表記まとめ

Pythonのリスト内包表記は、for文を使ったリスト作成処理を簡潔に記述できる便利な構文です。

基本形は次のとおりです。

[式 for 変数 in リスト]

条件を付ける場合は、

[式 for 変数 in リスト if 条件]

と書きます。

リスト内包表記を使うことで、リストの各要素を変換したり、条件に合う要素だけを抽出したりできます。

ただし、複雑な処理を無理に1行にまとめると、かえって読みにくくなります。

「短く書けるか」だけでなく「他の人が読んで理解できるか」を意識して使うことが大切です。

Pythonを実際に書いて覚える

リスト内包表記は、構文を暗記するだけではなかなか身につきません。

実際に、

[x * 2 for x in range(10)]

のような短いコードを書いて実行し、

  • どの値がリストに入るのか
  • forはどの順番で動いているのか

を確認していくと理解しやすくなります。

Pythonでは、コードを書いて実行し、結果を確認する練習を繰り返すことが重要です。

Pythonの関数・メソッドの全体像はPython基本関数・メソッド完全一覧にまとめています。