リスト内包表記
前回、enumerate関数の変わった使い方(開始値指定、奇数・偶数インデックスに分割、インデックスをキーとする辞書を作成)を紹介しました。
今回はリスト内包表記の変わった使い方を紹介します。
まずリスト内包表記ですが、こんな感じでfor文を使いつつ、1行でリストを作成できる表記でした。
val_list = [2 * val for val in range(10)]
print(val_list)
実行結果
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
ちなみにリスト内表表記に関する記事はいくつか書いておりますので、よかったらどうぞ。
それでは始めていきましょう。
複数のリストから一つずつ値を取得して2次元リストを作成
まずは複数のリストから一つずつ値を取得して、2次元リストを作成する方法を紹介します。
その場合、リスト内包表記を使いつつ、zip関数で複数のリストから一つずつ値を取得しつつ、新たなリストにまとめていくということをやります。
つまりこんな感じです。
val_list = [[val1, val2] for val1, val2 in zip(range(0, 10), range(20,30))]
print(val_list)
実行結果
[[0, 20], [1, 21], [2, 22], [3, 23], [4, 24], [5, 25], [6, 26], [7, 27], [8, 28], [9, 29]]
ちなみにNumPyを使い、転置することで同じリストを作成することができます。
import numpy as np
val_list = np.array([range(0, 10), range(20, 30)]).T
print(val_list)
実行結果
[[ 0 20]
[ 1 21]
[ 2 22]
[ 3 23]
[ 4 24]
[ 5 25]
[ 6 26]
[ 7 27]
[ 8 28]
[ 9 29]]
二つのリスト内包表記で長さの違う2次元配列を作成
2つ目は二つのリスト内包表記を使って長さの違う2次元配列を作成する方法です。
リスト内包表記の中にさらにリスト内包表記を作ります。
val_list = [[j for j in range(i)] for i in range(10)]
print(val_list)
実行結果
[[], [0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4],
[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6, 7],
[0, 1, 2, 3, 4, 5, 6, 7, 8]]
二つのリスト内包表記間の値を掛け算したりして関連づけるなんてこともできます。
val_list = [[i * j for j in range(3)] for i in range(5)]
print(val_list)
実行結果
[[0, 0, 0], [0, 1, 2], [0, 2, 4], [0, 3, 6], [0, 4, 8]]
enumerate関数と合わせてインデックスをキーにもつ辞書を作成
3つ目はenumerate関数と合わせてインデックスをキーにもつ辞書を作成する方法です。
ちなみに前回、ほぼ同じことを紹介しましたが、前回はfor文だけで書いています。
それのリスト内包表記版というわけです。
data = ["A", "B", "C", "D", "E", "F"]
val_dict = {i: val for i, val in enumerate(data)}
print(val_dict)
実行結果
{0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E', 5: 'F'}
辞書のキーと値を入れ替え
4つ目は辞書のキーと値を入れ替える方法です。
「辞書.items()」でキーと値が取得できますので、反対にして辞書を作成します。
data = ["A", "B", "C", "D", "E", "F"]
val_dict = {i: val for i, val in enumerate(data)}
val_dict_rev = {val: key for key, val in val_dict.items()}
print(val_dict)
print(val_dict_rev)
実行結果
{0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E', 5: 'F'}
{'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5}
ユニークな値をもつセット型に変換
最後はリストからユニークな値をもつセット型に変換する方法です。
これは単純にリスト内包表記を使いつつ、セット型にするだけです。
val_list = [2, 3, 1, 5, 2, 4, 1, 3, 5, 2, 4, 3, 1, 5, 1]
val_unique = {val for val in val_list}
print(val_unique)
実行結果
{1, 2, 3, 4, 5}
次回はmatplotlibでPIL(Pillow)とBytesIOを使ってアニメーションを作成する方法を紹介します。
ではでは今回はこんな感じで。
コメント