6-1

内包表記

内包表記:for文を1行にまとめる通常のfor文(3行)result = []for x in range(5): result.append(x**2)内包表記(1行!)[x**2 for x in range(5)]✓ 簡潔・高速・Pythonic

リスト内包表記

リスト内包表記(list comprehension)は、リストを簡潔に作成する構文です。

基本形

python
# 通常の書き方squares = []for x in range(1, 6):    squares.append(x ** 2)squares   # [1, 4, 9, 16, 25]# リスト内包表記squares = [x ** 2 for x in range(1, 6)]squares   # [1, 4, 9, 16, 25]

一般形: [式 for 変数 in イテラブル]

条件フィルタ付き

python
# 偶数のみの2乗even_squares = [x ** 2 for x in range(1, 11) if x % 2 == 0]even_squares   # [4, 16, 36, 64, 100]# 文字列のフィルタリングwords = ["apple", "banana", "cherry", "date", "elderberry"]long_words = [w for w in words if len(w) > 5]long_words   # ["banana", "cherry", "elderberry"]

一般形(条件付き): [式 for 変数 in イテラブル if 条件]

ネストした内包表記

python
# 九九の表(フラットなリスト)products = [i * j for i in range(1, 4) for j in range(1, 4)]products   # [1, 2, 3, 2, 4, 6, 3, 6, 9]# 2次元リストの作成matrix = [[i * j for j in range(1, 4)] for i in range(1, 4)]# [[1, 2, 3], [2, 4, 6], [3, 6, 9]]

if-else を含む内包表記

python
# 正の数はそのまま、負の数は0に変換nums = [-2, 3, -1, 0, 5, -4]clipped = [x if x > 0 else 0 for x in nums]clipped   # [0, 3, 0, 0, 5, 0]

辞書内包表記

辞書内包表記も同様の形で辞書を作成できます。

python
# 辞書内包表記の基本words = ["apple", "banana", "cherry"]word_lengths = {w: len(w) for w in words}word_lengths   # {"apple": 5, "banana": 6, "cherry": 6}# フィルタ付きscores = {"alice": 85, "bob": 72, "charlie": 91, "diana": 68}passing = {name: score for name, score in scores.items() if score >= 75}passing   # {"alice": 85, "charlie": 91}

セット内包表記

セット内包表記を使うと、重複のない集合を作成できます。

python
# リストから重複を除去nums = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]unique = {x for x in nums}unique   # {1, 2, 3, 4}# 文字列の一意な文字集合chars = {ch.lower() for ch in "Hello World" if ch.isalpha()}chars   # {"h", "e", "l", "o", "w", "r", "d"}

ジェネレータ式

丸括弧 () を使うとジェネレータ式になります。リスト内包表記と似ていますが、一度に全要素をメモリに保持しません。

python
# リスト内包表記(全要素をメモリに保持)squares_list = [x ** 2 for x in range(1000000)]# ジェネレータ式(必要なときだけ計算)squares_gen = (x ** 2 for x in range(1000000))# sumなどの組み込み関数に直接渡せるtotal = sum(x ** 2 for x in range(101))   # 1〜100の2乗の合計total   # 338350

練習: 内包表記の練習

基礎

リスト内包表記を使って、1〜100の中で3の倍数かつ5の倍数ではない数のリストを作成してください。

練習: 転置行列

標準

2次元リスト(行列)の転置を内包表記で求めてください。