リスト内包表記
前書き
今回は、リスト内包表記について説明します。リスト内包表記をマスターすれば、コードがスッキリします。
内包表記の説明と種類
内包表記はあるイテラブルオブジェクトを利用して、別のイテラブルオブジェクトを作成するための記法のことです。内包表記には、リスト内包表記・辞書内包表記・セット内包表記があります。特に、リスト内包表記は頻出です。
リスト内包表記
リスト内包表記の基本構文は、次のようになります。
- [式 for 変数 in イテレータ]
リスト内包表記は、
- イテレータから1つずつ要素を取り出す
- 変数に代入する
- 式で評価
- リストに加える
という一連の流れを繰り返します。 この流れは、for文と同じです。
# sample.py l1 = [] for i in range(10): l1.append(i) print(l1) l2 = [i for i in range(10)] # iという変数に要素を代入している print(l2) l3 = [i*2 for i in range(10)] # 全ての要素を2倍している print(l3)
# 実行結果 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
実行結果は、上記のようになります。リスト内包表記により簡単に数字の配列を作成できることがわかります。このように、リスト内包表記を用いれば大概のfor文を置き換えることができます。式と書かれているところで何かしらの計算をすることもできます。
if文を含むリスト内包表記
if文を含むリスト内包表記の基本構文は、次のようになります。
- [式 for 変数 in イテレータ if 条件]
if文を含むリスト内包表記は、
- イテレータから1つずつ要素を取り出す
- 変数に代入する
- 条件判定⇨真:4番・偽:1番
- 式で評価
- リストに加える
という一連の流れを繰り返します。
#sample.py l1 = [] for i in range(10): if i % 2 == 0: l1.append(i) print(l1) l2 = [i for i in range(10) if i % 2 == 0] print(l2) l3 = [i*2 for i in range(10) if i % 2 == 0] print(l3)
[0, 2, 4, 6, 8] [0, 2, 4, 6, 8] [0, 4, 8, 12, 16]
実行結果は、上記のようになります。条件判定されて、期待通りの結果になっていることがわかります。
if~elseを含むリスト内包表記
if~else文を含むリスト内包表記の基本構文は、次のようになります。
- [式A if 条件 else 式B for 変数 in イテレータ ]
if~elseの場合は、ifのみの場合と場所が違うので気をつけてください。 if~else文を含むリスト内包表記は、
- イテレータから1つずつ要素を取り出す
- 変数に代入する
- 条件判定⇨真:式A・偽:式Bで評価
- リストに加える
という一連の流れを繰り返します。
# sample.py l1 = [] for i in range(10): if i % 2 == 0: l1.append(i) else: l1.append(i+1) print(l1) l2 = [i if i % 2 == 0 else i+1 for i in range(10)] print(l2) l3 = [i*2 if i % 2 == 0 else (i+1)*2 for i in range(10)] print(l3)
# 実行結果 [0, 2, 2, 4, 4, 6, 6, 8, 8, 10] [0, 2, 2, 4, 4, 6, 6, 8, 8, 10] [0, 4, 4, 8, 8, 12, 12, 16, 16, 20]
実行結果は上記のようになります。全ての要素を偶数にすることができました。
様々なリスト内包表記
今回紹介したものを組み合わせることによりできる、様々なリスト内包表記の例をサンプルとして挙げておきます。
# sample.py # 2次元リストの作成 l1 = [] l2 = [] for i in range(3): l2 = [] for j in range(3): l2.append(j) l1.append(l2) print(l1) l3 = [[i for i in range(3)] for _ in range(3)] # 使わない要素には_を使うことが多い print(l3)
# 実行結果 [0, 1, 2], [0, 1, 2], [0, 1, 2]] [[0, 1, 2], [0, 1, 2], [0, 1, 2]]
# sample.py # 複数の条件(要素が正なら1、負なら-1、ゼロなら0)による演算 l = [1, -2, 0, -3, 3, 5, 0, -2] l1 = [] for i in l: if i > 0: l1.append(1) elif i < 0: l1.append(-1) else: l1.append(0) print(l1) l2 = [1 if i > 0 else -1 if i < 0 else 0 for i in l] print(l2)
# 実行結果 [1, -1, 0, -1, 1, 1, 0, -1] [1, -1, 0, -1, 1, 1, 0, -1]
このようにリスト内包表記で様々なことができます。
しかし、複雑になりすぎるリスト内包表記は使わない方が良いでしょう。
あとがき
お疲れさまでした。辞書内包表記とセット内包表記は次回説明します。基本的にはリスト内包表記と同じです。