リスト内包表記の書き方
リスト内包表記とはリストの中にコードを書いてリストを作成する手法のことである。
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 |
速度を意識する場合、リスト内包表記は有用である。
しかし、リスト内包表記を多用しすぎると可読性が落ちることには注意を払う必要がある。