基本形
リスト/タプルからの要素の取り出し
リスト/タプルの要素を順に取り出したリストを返す。
1 2 3 4 5 6 7 |
lst = [1, 2, 3, 4] tpl = (1, 2, 3, 4) [n for n in lst] [n for n in tpl] # いずれも[1, 2, 3, 4] |
range()を使ったリストの生成
1 2 3 4 5 |
[x for x in range(5)] # [0, 1, 2, 3, 4] [x for x in range(4, -5, -2)] # [4, 2, 0, -2, -4] |
要素の演算
要素に対して順次同じ演算を施す。
1 2 |
[x * x for x in range(5)] # [0, 1, 4, 9, 16] |
floatの要素
小数部分を持った数値を要素とする方法。
1 2 3 4 5 6 7 |
# 0から始めて0.3ずつ増やして5個 [x / 10 for x in range(0, 0+3*5, 3)] # [0.0, 0.3, 0.6, 0.9, 1.2] # 1から3まで0.25刻み [x / 100 for x in range(100, 301, 25)] # [1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0] |
ifの使用
抽出する要素の条件の指定
後置if文で要素が条件に合致した場合のみ値に送ることができる。ただしelseは使えない。
1 2 |
[x for x in range(10) if 3 < x < 7] # [4, 5, 6] |
抽出した要素の条件による値の選択
値を三項演算子にすることで、取り出された要素の条件によって値を変えることができる。
1 2 |
print([0 if x % 2 == 0 else 1 for x in range(10)]) # [0, 1, 0, 1, 0, 1, 0, 1, 0, 1] |
複数のループ
複数リストの同時ループ
複数のリストを同時に回すときは、2つの変数に対応するリストにzip()を使う。
1 2 |
[x + y for x, y in zip([1, 2, 3], [10, 20, 30])] # [11, 22, 33] |
多重ループ
多重ループの以下の2つの違いを押さえておく。
まず2つのforを連続させた場合。
1 2 3 4 5 6 7 8 9 10 |
print([r + c for r in [10, 20, 30] for c in [1, 2, 3]]) # [11, 12, 13, 21, 22, 23, 31, 32, 33] # 右側のループから内側で実行される # こう考えるとわかりやすい # 実際こう書いても結果は同じ print([r + c for r in [10, 20, 30] for c in [1, 2, 3]]) # [11, 12, 13, 21, 22, 23, 31, 32, 33] |
次にforを[]で囲んだ場合。
1 2 3 4 5 6 7 8 |
print([[r + c for r in [10, 20, 30]] for c in [1, 2, 3]]) # [[11, 21, 31], [12, 22, 32], [13, 23, 33]] # こうすれば見やすいか? print([ [r + c for r in [10, 20, 30]] for c in [1, 2, 3]]) # [[11, 21, 31], [12, 22, 32], [13, 23, 33]] |
入れ子のコレクションへのアクセス
入れ子になったリストなどの要素へのアクセスは、一時変数を使って多重ループ。
1 2 |
[n for sublist in [[1, 2], [3, 4, 5], [6, 7]] for n in sublist] # [1, 2, 3, 4, 5, 6, 7] |
多重配列の作成
多重配列の作成は、内側の要素から考えていくとわかりやすい。
1 2 |
[[0 for col in range(3)] for row in range(4)] # [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] |
内包表記ではないが、以下の記法でも同じ結果を得る。
1 2 |
[[0] * 3] * 4 # [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] |
応用
要素数が増減する多重配列
要素数が順次増減する配列の例。内側のリストの終値=長さを変数として、その変数を外側のループで回している。
1 2 3 4 5 |
[[n for n in range(m + 1)] for m in range(5)] # [[0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4]] [[n for n in range(m, -1, -1)] for m in range(4, -1, -1)] # [[4, 3, 2, 1, 0], [3, 2, 1, 0], [2, 1, 0], [1, 0], [0]] |
2つのリストの交互結合
2つのリストの要素を交互に結合する。たとえば[1, 3, 5]と[2, 4, 6]から[1, 2, 3, 4, 5, 6]を生成。
1 2 |
[z for sublist in [[x, y] for x, y in zip([1, 3, 5], [2, 4, 6])] for z in sublist] [1, 2, 3, 4, 5, 6] |
- 各リストから1つずつ要素を取り出し、それらを要素とするリストを作成
[[x, y] for x, y in zip([1, 3, 5], [2, 4, 6])]
-> [[1, 2], [3, 4], [5, 6]]
- その結果から各要素リストを
sublist
として取り出す - 各サブリストから順次要素を取り出して、全体リストの要素とする