Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Python辞典

  1. トップページ
  2. Python辞典
  3. リスト内包表記

リスト内包表記

リスト内包表記はPythonの独自機能で、1行でリストを生成する簡潔な構文です。for文と条件式を組み合わせてデータを変換・フィルタリングできます。

構文
# 基本的なリスト内包表記です。
[式 for 変数 in イテラブル]

# 条件付きリスト内包表記です(if 節でフィルタリング)。
[式 for 変数 in イテラブル if 条件]

# 条件式(三項演算子)を使って値を変換します。
[真の値 if 条件 else 偽の値 for 変数 in イテラブル]

# ネストしたリスト内包表記(2次元データの処理)です。
[式 for 変数1 in イテラブル1 for 変数2 in イテラブル2]

# 辞書内包表記・セット内包表記も同様の構文を使います。
{キー: 値 for 変数 in イテラブル}
{式 for 変数 in イテラブル}
関数一覧
構文パターン概要
[式 for x in iterable]イテラブルの各要素に式を適用した結果のリストを生成します。map() の代替として使われます。
[式 for x in iterable if 条件]条件を満たす要素だけに式を適用したリストを生成します。filter() の代替として使われます。
[A if 条件 else B for x in iterable]条件によって出力値を切り替えながらリストを生成します。
[式 for x in it1 for y in it2]2つのイテラブルの直積(ネストしたループ)に対してリストを生成します。
{k: v for x in iterable}辞書内包表記。キーと値のペアで辞書を生成します。
サンプルコード
# 基本的なリスト内包表記で二乗のリストを作ります。
squares = [x ** 2 for x in range(1, 6)]
print(squares)  # [1, 4, 9, 16, 25]

# for文で書いた場合と同じ結果です。
squares2 = []
for x in range(1, 6):
    squares2.append(x ** 2)

# 条件付きで偶数のみの二乗リストを作ります。
even_squares = [x ** 2 for x in range(1, 11) if x % 2 == 0]
print(even_squares)  # [4, 16, 36, 64, 100]

# 文字列のリストを大文字に変換します。
words = ["hello", "world", "python"]
upper_words = [w.upper() for w in words]
print(upper_words)  # ['HELLO', 'WORLD', 'PYTHON']

# 条件式(三項演算子)で偶数・奇数を判定します。
labels = ["偶数" if x % 2 == 0 else "奇数" for x in range(1, 7)]
print(labels)  # ['奇数', '偶数', '奇数', '偶数', '奇数', '偶数']

# 文字列のリストから空文字列を除外します。
raw_data = ["太郎", "", "花子", "  ", "次郎"]
names = [name for name in raw_data if name.strip()]
print(names)  # ['太郎', '花子', '次郎']

# ネストしたリスト内包表記で2次元リストを1次元に展開します。
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [x for row in matrix for x in row]
print(flat)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 2つのリストの直積(組み合わせ)を作ります。
colors = ["赤", "青"]
sizes = ["S", "M", "L"]
variants = [(c, s) for c in colors for s in sizes]
print(variants)
# [('赤', 'S'), ('赤', 'M'), ('赤', 'L'), ('青', 'S'), ('青', 'M'), ('青', 'L')]

# 辞書内包表記でキーと値を入れ替えます。
original = {"a": 1, "b": 2, "c": 3}
inverted = {v: k for k, v in original.items()}
print(inverted)  # {1: 'a', 2: 'b', 3: 'c'}

# セット内包表記で重複を除外します。
nums = [1, 2, 2, 3, 3, 3, 4]
unique = {x for x in nums}
print(unique)  # {1, 2, 3, 4}(順序は保証されません)
概要

リスト内包表記は通常のfor文よりも高速に動作します。これはPythonインタープリタが内包表記を最適化しているためです。また、ループカウンタを別途管理する必要がなく、コードが簡潔になります。

ただし、複雑な処理を1行に詰め込みすぎると可読性が下がります。目安として、内包表記が一目で理解できない場合や、ネストが3段以上になる場合は、通常のfor文に書き直す方が保守しやすいコードになります。

リスト内包表記に似た構文として、ジェネレータ式(『()』を使う)があります。『(x**2 for x in range(10))』はリストではなくジェネレータを生成するため、一度に全要素をメモリに展開しません。大量のデータを処理する場合はジェネレータ式の方がメモリ効率が良いです。変換・フィルタリングの別の書き方については『map() / filter()』も参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。