python リスト内包表記のメモ


リスト内包表記の書き方

リスト内包表記とはリストの中にコードを書いてリストを作成する手法のことである。

square.py
square = [i ** 2 for i in range(10)]
# >> [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

リスト内包表記では、if文で分岐する記載も可能である。

even_square.py
even_square = [i ** 2 for i in range(1:10) if i % 2 == 0]
# >> [4, 16, 36, 64]

if-else文での分岐処理も可能である。
ただしif文のみで作成する場合とは順番が異なることに注意が必要である。

odd_and_even_square.py
odd_and_even_square = [i ** 2 if i % 2 == 0 else i for i in range(1, 10)]
# >> [1, 4, 3, 16, 5, 36, 7, 64, 9]

elifは使えない。しかし、if-elseを駆使しすることで複雑なコードを記述することは可能である。
例えばfizzbuzzの場合は以下のように記載できる。

fizzbuzz.py
fizzbuzz = ['fizzbuzz' if i % 15 == 0 else 'fizz' if i % 3 == 0 else 'buzz' if i % 5 == 0 else i for i in range(1, 20)]]
# >> [1, 2, 'fizz', 4, 'buzz', 'fizz', 7, 8, 'fizz', 'buzz', 11, 'fizz', 13, 14, 'fizzbuzz', 16, 17, 'fizz', 19]

リスト内包表記の処理時間

1~10,000,000までの偶数を2乗したリストを、for文で作成した時とリスト内包表記で作成したときでは、どの程度時間に差があるのかを比較してみた。

試行回数 for文 リスト内包表記
1回目 2.989s 2.354s
2回目 3.191s 2.455s
3回目 3.120s 2.371s
4回目 3.219s 2.434s
5回目 3.134s 2.387s
平均 3.131s 2.400s

速度を意識する場合、リスト内包表記は有用である。
しかし、リスト内包表記を多用しすぎると可読性が落ちることには注意を払う必要がある。