Python リストとジェネレータ式とリスト内包表記の違い

目次

リストとジェネレータ式とリスト内包表記の違いのまとめ

書き方 評価方法 主な用途
リスト [ ] すぐに全要素生成 小~中規模データの操作
ジェネレータ式 ( )  必要な時に順次生成 大量データ・無限列
リスト内包表記 [ ] すぐに全要素生成 簡潔にリストを生成

リスト → データを全部メモリに置いておきたいとき。

ジェネレータ式 → データを順次処理したいとき(大量 or 無限)。

リスト内包表記 → リストを簡潔に作るための文法。単なる糖衣構文で、内部的には通常のリストと同じです。

糖衣構文

人間にとって書きやすく、読みやすくするための文法の工夫のことです。
中身は従来の書き方に展開できます。

リストとは

fruits = ["apple", "banana", "orange"]
fruits[0]        # "apple"
fruits.append("grape")  # 追加可能

書き方: [ ]

特徴

すべての要素を一度に生成してメモリに保持。

ランダムアクセス(list[5] など)ができる。

複数回使える(再利用可能)。

ジェネレータ式とは

gen = (x * x for x in range(3))

print(next(gen))  # 0
print(next(gen))  # 1
print(next(gen))  # 4
# print(next(gen))  # StopIteration (もう要素がない)

書き方: (式 for 変数 in イテラブル) 

特徴

値が必要になった時に順次生成(遅延評価)。

メモリ効率が良い(大きなデータや無限列に向いている)。

使い切り(1度ループしたら空になる)。

インデックスアクセス不可(gen[2] はエラー)。

リスト内包表記とは

nums = [x * x for x in range(3)]
print(nums)   # [0, 1, 4]

書き方: [式 for 変数 in イテラブル if 条件]

特徴

書きやすい短縮記法。

リストを返す(= すぐに全要素を生成する)。

リストの生成と「forループ+append」をまとめて書ける。

関連の記事

Python ジェネレータ(generator)
Python ジェネレータとジェネレータ式の違い
Python リストとタプルとディクショナリの違い

△上に戻る