リスト内包表記

前回はfor文について学習しましたが、for文を利用すると内包表記と呼ばれる便利な記法を使えるようになります。複雑なリスト等の生成を簡潔に記述することが可能となります。

リスト内包表記

リスト内包表記とはリストコンプリヘンションとも呼ばれ、イテラブルな変数とループを利用して新たなリストを生成する構文のことです。他の言語ではあまり見慣れない構文のためはじめは戸惑うかもしれませんが、慣れると便利な上、使わない場合と比較して処理が速いというメリットがあります。

単純なリスト内包表記
[処理 for 変数 in リスト ]
if文と組み合わせたリスト内包表記
[処理 for 変数 in リスト if リスト要素に対する条件]

構文としては上記の通りなのですが、これだけだと何のことかわかりません。具体例で動作を確認してみましょう。

リスト内包表記の基本例

まずは単純な例からです。ある数値のリストが与えられていたとします。そのリストの各要素を倍にしたリストを生成する場合について考えてみましょう。

リスト内包表記を使用しない場合、以下のようになります。

data_list = [5, 3, 7, 4, 10, 9, 6]
new_list = []
for num in data_list:
    new_num = num * 2
    new_list.append(new_num)

print(new_list) # [10, 6, 14, 8, 20, 18, 12]

これと同じ処理をリスト内包表記で表してみましょう。以下のように書き換えることができます。

data_list = [5, 3, 7, 4, 10, 9, 6]
new_list = [num * 2 for num in data_list]
print(new_list) # [10, 6, 14, 8, 20, 18, 12]

ずいぶんとスッキリ書くことができました。変数numはdata_listをループ処理する際の変数で、ここの順番が前後するため最初は理解することが難しく感じるのではないでしょうか。

if文と組み合わせる

また、if文と組み合わせて条件を加えて生成することが可能です。少々複雑に感じるかもしれませんが、順を追って説明しますのでついてきてください。

ある数値のリストが与えられていたとします。このリストに対し、「①各要素に対し、②偶数番目の要素を抜き出し、③2倍した結果」のリストを新たに作成することを考えてみます。

まずはリスト内包表記を使わない場合を考えてみます。

data_list = [5, 3, 7, 4, 10, 9, 6]
new_list = []

for num in data_list:
    if num % 2 == 0:
        new_num = num * 2
        new_list.append(new_num)

print(new_list)

これと同じ処理をリスト内包表記で表すと、このように書き換えることができます。

data_list = [5, 3, 7, 4, 10, 9, 6]
new_list = [num * 2 for num in data_list if num % 2 == 0]

どちらも実行すると以下のように出力されます。
実行結果

[8, 20, 12]

if文によって抽出時の条件が追加されたことが確認できます。

イテラブルなら何でも可

また、inの後に続くものはイテラブルなものであれば何でも可能です。inの後ろに辞書を使ったサンプルを見てみましょう。以下のサンプルでは、辞書のキーに対して前後に装飾文字列をつけてみます。

data_dict = {"A": "apple", "B": "banana", "C": "orange"}
new_list = ["---" + key + "---" for key in data_dict]
print(new_list)  # ['---A---', '---B---', '---C---']

もう一つサンプルです。キーと値の組み合わせの文字列を出力してみましょう。

data_dict = {"A": "apple", "B": "banana", "C": "orange"}
new_list = [k + ":" + v for k, v in data_dict.items()]
print(new_list)  # ['A:apple', 'B:banana', 'C:orange']

その他の内包表記

リスト以外に同様の記法でset、辞書を生成することが可能です。リスト内包表記と比較すると出番が少ないかもしれませんが、ここで簡単に紹介したいと思います。

集合内包表記

リスト内包表記の大括弧を中括弧に変えるとsetの生成が可能です。先程紹介したリスト内包表記と同様にsetを生成してみます。

data_list = [5, 3, 7, 4, 10, 9, 6]
new_set = {num * 2 for num in data_list}
print(new_set)  # {6, 8, 10, 12, 14, 18, 20}

辞書内包表記

リスト内包表記の大括弧を中括弧に変え、キーと値を指定すると新たな辞書を生成することが可能です。以下のサンプルではリストの要素をキー、リストの要素を3倍したものを値とする新たな辞書を生成しています。

data_list = [5, 3, 7, 4, 10, 9, 6]
new_dict = {num: num * 3 for num in data_list}
print(new_dict)  # {5: 15, 3: 9, 7: 21, 4: 12, 10: 30, 9: 27, 6: 18}

 

最初は難しく感じるかもしれませんが、リスト等の生成が簡潔に記述でき、処理も早くなるため是非マスターしてください。