リスト内包表記 — 1行でリストを作成
このトピックを修了すると
for文の4行を1行にまとめるリスト内包表記の構文を理解し、条件によるフィルタリングや辞書内包表記を使用できるようになります。
for文が繰り返されるパターン
リストを作成する際に、次のようなコードをよく使用します。
numbers = [1, 2, 3, 4, 5]squares = []for n in numbers: squares.append(n ** 2)
print(squares) # [1, 4, 9, 16, 25]これは4行のコードです。空のリストを作成し、for文でループし、appendします。このパターンが繰り返されます。Pythonは、これを1行にまとめる構文を提供しています。
squares = [n ** 2 for n in numbers]これがリスト内包表記(list comprehension)です。
構造
[式 for 変数 in イテラブル]読み方:「イテラブルから変数を1つずつ取り出し、式を適用した結果をリストにする」。
# 文字列を大文字に変換names = ['alice', 'bob', 'charlie']upper = [name.upper() for name in names]# ['ALICE', 'BOB', 'CHARLIE']
# 文字列の長さlengths = [len(name) for name in names]# [5, 3, 7]
# 1から10までnums = [i for i in range(1, 11)]# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]条件によるフィルタリング — ifを追加
[式 for 変数 in イテラブル if 条件]numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 偶数のみevens = [n for n in numbers if n % 2 == 0]# [2, 4, 6, 8, 10]
# 3より大きい数の2乗big_squares = [n ** 2 for n in numbers if n > 3]# [16, 25, 36, 49, 64, 81, 100]ifはフィルタの役割を果たします。条件に一致するものだけが結果に含まれます。
for文で書くと:
evens = []for n in numbers: if n % 2 == 0: evens.append(n)5行が1行になります。
if-else — 条件付き変換
フィルタではなく、変換を行いたい場合は、if-elseを先頭に置きます。
# 偶数の場合は「偶」、奇数の場合は「奇」labels = ["偶" if n % 2 == 0 else "奇" for n in range(1, 6)]# ['奇', '偶', '奇', '偶', '奇']位置が異なります。
- フィルタ(除外):
[x for x in lst if 条件]— ifが後 - 変換(選択):
[A if 条件 else B for x in lst]— if-elseが先
辞書内包表記
中括弧で囲むと辞書を作成します。
names = ['alice', 'bob', 'charlie']name_len = {name: len(name) for name in names}# {'alice': 5, 'bob': 3, 'charlie': 7}# 値を反転original = {'a': 1, 'b': 2, 'c': 3}flipped = {v: k for k, v in original.items()}# {1: 'a', 2: 'b', 3: 'c'}セット内包表記
中括弧 + 値のみを記述すると、セットになります。
words = ['hello', 'world', 'hello', 'python']unique_lengths = {len(w) for w in words}# {5, 6}可読性に関する警告
# これは問題ありませんresult = [x * 2 for x in range(10) if x % 2 == 0]
# これは読みにくいresult = [f(x, y) for x in range(10) for y in range(10) if x != y if g(x, y) > threshold]内包表記が1行に収まらない場合、またはネストされたfor文 + 2つ以上の条件がある場合は、通常のfor文を使用する方が適切です。短いコードが常に良いコードであるとは限りません。読みやすいコードが優れたコードです。
重要なポイント
リスト内包表記は、
[式 for 変数 in イテラブル if 条件]を使用して、1行でリストを作成する構文です。 フィルタリングには、ifを後、条件付き変換には、if-elseを先頭に置きます。{}+key: valueの場合は辞書、{}+ 値のみの場合はセット内包表記です。 1行に収まらない場合はfor文を使用してください — 可読性が最優先です。