リスト内包表記
リスト内包表記(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次元リスト(行列)の転置を内包表記で求めてください。