2020年3月29日日曜日

【リスト】リスト内包表記

 リスト内包表記はリストを示す[]内にfor文を含む式を記述したもの。式の内容に応じたイテラブルオブジェクトが生成される。リスト内包表記を使えば複雑なリストが1行のコードで簡潔に生成できる。


1. リスト内包表記の書式

 リスト内包表記はfor文、rangeと組み合わせて使う。rangeの範囲で値を変化させリストを生成する。
range(6)つまり0から5までのリストを生成する場合。

newlist = [i for i in range(6)]
print(newlist)

実行結果

[0, 1, 2, 3, 4, 5]


 引数として演算を含むことが可能。iを0から5まで変化させ、iの5倍のリストを作る場合。

newlist = [i*5 for i in range(6)]
print(newlist)

実行結果

[0, 5, 10, 15, 20, 25]


 rangeに開始位置、終了位置を指定すると任意の範囲でリストを作ることができる。
iを4から9(10の手前)まで変え、iの5倍をリストにする場合。

newlist = [i*5 for i in range(4, 10)]
print(newlist)

実行結果

[20, 25, 30, 35, 40, 45]


2. 二次元以上の場合

 複数の変数を()で囲みそれぞれに対してrangeで範囲を指定すると二次元以上のリストが生成できる。

newlist = [[x, y, z] for x in range(2) for y in range(2) for z in range(3)]
print(newlist)

実行結果

[[0, 0, 0],
 [0, 0, 1],
 [0, 0, 2],
 [0, 1, 0],
 [0, 1, 1],
 [0, 1, 2],
 [1, 0, 0],
 [1, 0, 1],
 [1, 0, 2],
 [1, 1, 0],
 [1, 1, 1],
 [1, 1, 2]]


範囲はrangeではなくリストで指定してもよい。

newlist = [[x, y, z] for x in [3, 4] for y in [6, 7] for z in [9, 10]]
print(newlist)

実行結果

[[3, 6, 9],
 [3, 6, 10],
 [3, 7, 9],
 [3, 7, 10],
 [4, 6, 9],
 [4, 6, 10],
 [4, 7, 9],
 [4, 7, 10]]


3. 内包表記のネスト

 内包表記の最初の式は任意の式なのでそれを内包表記で書くネストが可能。
最初の内包表記のrangeの範囲を次の内包表記で変化させている。

newlist = [[j for j in range(i)] for i in range(6)]
print(newlist)

実行結果

[[], [0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4]]


4. if文との組み合わせ

 内包表記をif文と組み合わせることで特定の条件のリストを作成可能
次の例ではiを2で割った余りが0、つまり偶数の場合のみif文がtrueとなりリストに追加される。

newlist = [i for i in range(6) if i % 2 == 0]
print(newlist)

実行結果

[0, 2, 4]


5. リファレンス

Python チュートリアル > 5.1.3. リストの内包表記

使用バージョン:Python 3.7.0

0 件のコメント:

コメントを投稿