🐍
pythonのlist内包表記の使い方
python list内包表記の使い方
リスト内包表記を使うとコードが短くなるだけでなく実行効率も上がる
ということでその使い方
使いどころは、
あるシーケンスや iterableのそれぞれの要素に対してある操作を行った結果を要素にしたリストを作ったり、ある条件を満たす要素だけからなる部分シーケンスを作成する
ところ
簡単な例
# 0から9のリストを作る
numbers = []
for x in range(10):
numbers.append(x)
# numbers
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
こんなリストを作成するforループがあったとして
これをリスト内包表記を使うと以下のように書ける
# 0から9のリストを作る
numbers = [x for x in range(10)]
# numbers
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
pythonでリスト要素にappendを行う場合
append()はリストのメソッドなので、イテレーション毎にリストからappend属性を取り出し関数として実行することになる
この属性の取り出しと関数として実行がなくなるのでリスト内包表記は早い
詳しくはここをみるといい
if文を含める
リスト内包表記にはif文を含めて書くこともできる
# 偶数のリストを作る
even_numbers = [x for x in range(10) if x % 2 == 0]
# evne_numbers
# [0, 2, 4, 6, 8]
三項演算を使ってelseを入れることもできる
この場合if else節をforの前に持ってくる
# 偶数はそのまま奇数は0のリストを作る
even_odd0 = [x if x % 2 == 0 else 0 for x in range(10)]
# even_odd0
# [0, 0, 2, 0, 4, 0, 6, 0, 8, 0]
if文を使う時の注意
ifだけをforの前に持ってきたり、if elseを後ろに持っていくことはできない
# これはエラー
numbers = [x if x % 2 == 0 for x in range(10)]
# これもエラー
numbers = [x for x in range(10) if x % 2 == 0 else 0]
for文をネストする
for文をネストして2重のループも可能
# for文のネスト
numbers = [(x, y) for x in range(5) for y in range(2)]
# numbers
# [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1), (4, 0), (4, 1)]
listをネストする
ネストしたリストを作ることも可能
# ネストしたリスト
numbers = [[x + y for y in range(3)] for x in range(5)]
# numbers
# [[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]
辞書内包表記
辞書(dict型)も内包表記にできる
# 1番からのキーを設定した0~9までの辞書
numbers = {str(x+1): x for x in range(10)}
コロンの左がキー、右がバリューになる
参考
- https://docs.python.org/ja/3/tutorial/datastructures.html#list-comprehensions
- Michat Jaworski・Tarek Ziade (2018) エキスパートPythonプログラミング改訂2版 株式会社ドワンゴ
- http://dsas.blog.klab.org/archives/51742727.html
Discussion