【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)]
複雑に見えるかもしれませんが、「外側のループから内側へ」という順序を意識すれば読みやすくなります。
if-else
)
4. 値ごとに条件分岐したいとき(リスト内包表記の中で 三項演算子を使うことで、値ごとに条件分岐させることも可能です。
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