🔁

【Python】リスト内包表記の基本と使いどころを解説

に公開

はじめに

Pythonには「リスト内包表記(List Comprehension)」という便利な記法があります。

これは、リストを生成するときに for 文を使わずに、簡潔かつ直感的に書ける構文です。
初めは少しわかりにくいかもしれませんが、
慣れると「コードの見通しが良くなる」「記述量が減る」など多くのメリットがあります。

本記事では、リスト内包表記の基本的な使い方から、条件付き・入れ子のパターンまで順にご紹介します。

1. 基本の書き方

まずは、通常の for 文でリストを作るコードと、リスト内包表記の比較から見てみましょう。

通常の for

squares = []
for i in range(5):
    squares.append(i ** 2) # i の 2乗を求める
print(squares)  # [0, 1, 4, 9, 16]

リスト内包表記

squares = [i ** 2 for i in range(5)]
print(squares)  # [0, 1, 4, 9, 16]

[式 for 変数 in イテラブル] という形で書くのが基本です。
for文に比べて、1行で完結するためコードがすっきりします。

2. 条件付きのリスト内包表記

「偶数だけをリストに入れたい」といった、条件付きのリスト生成もできます。

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

💡 条件は for の後ろに書きます。if を付けることでフィルター処理ができます。

3. ネスト(入れ子)のリスト内包表記

2重のループも、リスト内包表記で書くことができます。

pairs = [(x, y) for x in range(3) for y in range(2)]
print(pairs)  # [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]

複雑に見えるかもしれませんが、「外側のループから内側へ」という順序を意識すれば読みやすくなります。

4. 値ごとに条件分岐したいとき(if-else

リスト内包表記の中で 三項演算子を使うことで、値ごとに条件分岐させることも可能です。

labels = ["偶数" if i % 2 == 0 else "奇数" for i in range(5)]
print(labels)  # ['偶数', '奇数', '偶数', '奇数', '偶数']

💡 この場合は for よりも前に if-else を書く点に注意してください。

5. () で囲むとリストではなくなるので注意

内包表記は、使うカッコによって結果の型が変わります

result = (i for i in range(5))
print(result)  # <generator object ...>

この書き方は、「リスト」ではなく「ジェネレーター」になります。

リストとして扱いたい場合は、必ず [] を使いましょう。

result = [i for i in range(5)]
print(result)  # [0, 1, 2, 3, 4]

💡 () を使うと、あとから1つずつ取り出す省メモリな処理になりますが、本記事では「リストとして扱いたいとき」に限って解説しています。

おわりに

リスト内包表記は、一見すると難しそうに見えるかもしれませんが、

  • 簡潔で読みやすいコードが書ける
  • 条件付きや入れ子の書き方も柔軟
  • 実務でもよく使われている

といったメリットがあります。

無理に使う必要はありませんが、「ここは内包表記の方が簡潔に書けそうだ」と感じたときに使えるようにしておくと便利です。

本記事が参考になれば幸いです。

Discussion