1. ホーム 
  2. 備忘録 
  3. Python

リスト内包表記

リスト内包表記とは

既存のリストから新しいリストを作ることができる、リスト作成方法の一つである

リスト内包表記の書き方について以下に記載する


t = (1, 2, 3, 4, 5)

### 基本的な書き方
# 中身を3倍にしたリストを作る
r = [i * 3 for i in t]
print(r, type(r))  # [3, 6, 9, 12, 15] <class 'list'>

### if文を組み合わせる
# 偶数のみ追加したリストを作る
r = [i for i in t if i % 2 == 0]
print(r, type(r))  # [2, 4] <class 'list'>

### 複数のタプルからリストを作成する
# t と t2 をかけ合わせたリストを作る
t2 = (10, 100)
r = [i * j for i in t for j in t2]
print(r)  # [10, 100, 20, 200, 30, 300, 40, 400, 50, 500]

"""
リスト内包表記のメリット
・ステップ数が減るのでいちいち append するより比較的高速
・1行で書けてコードが短くなる

注意点として膨大な量の入力が必要な場合は、
リスト内包表記を使うとメモリを大量に消費する可能性があるため、
ジェネレータ内包表記を検討すること
また、1行で書けるからといって条件を複雑にしていくと可読性が下がるため、
長くなる場合は通常の方法で複数行にわけてリストを作成すること
"""

メモリサイズについて

リスト内包表記とlistでは確保されているメモリサイズが違う (Python 3.7)

上記のサイトでは Python3.7 で リスト内包表記 < list(range()) といった結果が出ていたようだが Python3.9 にて自分で試してみたところ違う結果が出たので一応メモしておく

Python3.7 よりどれもメモリ使用量が減っているものの、各リスト生成方法でサイズに大きく差が出たので、こちらの変化の理由がわかったらまた更新していきたい…


# メモリ比較(Python 3.9.12)
l1 = list(range(10))
l2 = [x for x in range(10)]
l3 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

if l1 == l2 and l2 == l3:
    print('Equal')  # Equal
    
print(sys.getsizeof(l1))  # 136
print(sys.getsizeof(l2))  # 184
print(sys.getsizeof(l3))  # 152