リスト内包表記

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

リスト内包表記

リスト内包表記とは、リストコンプリヘンションとも呼ばれ、リストオブジェクトとループを利用して新たなリストを生成する構文のことです。

他の言語ではあまり見慣れない構文のためはじめは戸惑うかもしれませんが、慣れると便利な上、使わない場合と比較して処理が速いというメリットがあります。

リスト内包表記
[変数対する処理 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の後に続くものはシーケンシャルでなくともイテラブルなものでも可能です。辞書のサンプルを見てみましょう。辞書のキーに対して前後に装飾文字列をつけてみます。

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

ただし、辞書は順序が保たれないという点に注意してください。もう一つサンプルです。キーと値の組み合わせの文字列を出力してみましょう。

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

 

いかがでしょうか?最初は難しく感じるかもしれませんが、前述のメリットがあるので是非マスターしてください。