🐍

pythonのlist内包表記の使い方

2024/08/27に公開

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)}

コロンの左がキー、右がバリューになる

参考

Discussion