一覧へ

リスト内包表記 — 1行でリストを作成

Pythonのリスト内包表記(list comprehension)を使って、繰り返し文を1行にまとめる方法と、条件によるフィルタリングまで学びます。

入門
|
8
|
検証済み (2026-07)
リスト内包表記list comprehension1行リストフィルタリングdict comprehension
進捗0/18 (0%)

リスト内包表記 — 1行でリストを作成

このトピックを修了すると

for文の4行を1行にまとめるリスト内包表記の構文を理解し、条件によるフィルタリングや辞書内包表記を使用できるようになります。


for文が繰り返されるパターン

リストを作成する際に、次のようなコードをよく使用します。

python
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行にまとめる構文を提供しています。

python
squares = [n ** 2 for n in numbers]

これがリスト内包表記(list comprehension)です。


構造

python
[式 for 変数 in イテラブル]

読み方:「イテラブルから変数を1つずつ取り出し、式を適用した結果をリストにする」。

python
# 文字列を大文字に変換
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を追加

python
[式 for 変数 in イテラブル if 条件]
python
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文で書くと:

python
evens = []
for n in numbers:
if n % 2 == 0:
evens.append(n)

5行が1行になります。


if-else — 条件付き変換

フィルタではなく、変換を行いたい場合は、if-elseを先頭に置きます。

python
# 偶数の場合は「偶」、奇数の場合は「奇」
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が先

辞書内包表記

中括弧で囲むと辞書を作成します。

python
names = ['alice', 'bob', 'charlie']
name_len = {name: len(name) for name in names}
# {'alice': 5, 'bob': 3, 'charlie': 7}
python
# 値を反転
original = {'a': 1, 'b': 2, 'c': 3}
flipped = {v: k for k, v in original.items()}
# {1: 'a', 2: 'b', 3: 'c'}

セット内包表記

中括弧 + 値のみを記述すると、セットになります。

python
words = ['hello', 'world', 'hello', 'python']
unique_lengths = {len(w) for w in words}
# {5, 6}

可読性に関する警告

python
# これは問題ありません
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文を使用してください — 可読性が最優先です。

💬 質問・コメント

0件のコメント

ログインせずに投稿できます。ゲスト投稿は投稿者自身で編集・削除できません。

0/2000

読み込み中...