2024.3.25 リスト内包表記
イテラブルオブジェクトの値をもとに新たなリストを生成する方法に、リスト内包表記(List Comprehension)がある。
基本形
まず、通常のリストを生成する方法を示す。range(10)はイタレブルオブジェクトであり、これが生成する値を用いて新たなリストyを生成している。
$ y[i] = i, i=0,1,2,...,9
code:nolc01.py
y = []
for i in range(10):
y.append(i)
print(y)
リスト内包表記を用いると、次のように記述できる。
code:lc01.py
y = i for i in range(10)
print(y)
イテラブルオブジェクトが返す値をもとに計算して得られた値を格納してみる。
$ y[i] = (i + 1)^2, i=0,1,2,...,9
code:nolc02.py
y = []
for i in range(10):
y.append((i + 1)**2)
print(y)
これは次のように記述できる。
code:lc02.py
y = (i + 1)**2 for i in range(10)
print(y)
いろいろなイテラブルオブジェクトからの生成
リストや辞書はイテラブルオブジェクトであるため、リスト内包表記に利用できる。
code:lc03.py
x = [2, 'Hoge', 3.14, 1, 2, 3]
y = i for i in x
print('x:', type(x), x)
print('y:', type(y), y)
code:lc04.py
x = {'Taro':123, 'Hanako':456, 'Jiro':789}
print('x:', type(x), x)
y_keys = i for i in x.keys()
y_vals = i for i in x.values()
print('y_keys:', type(y_keys), y_keys)
print('y_vals:', type(y_vals), y_vals)
ネストされた例
二次元のリストを生成することができる。
code:lc05.py
y = [i + 4*j for i in range(4) for j in range(3)]
print(y)
応用例
code:lc06.py
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(0, 6*np.pi, 20)
xx = np.sin(t)
yy = np.sin(t)
data = [x + y for y in yy for x in xx]
plt.pcolormesh(data)
plt.show()
https://scrapbox.io/files/6600c91c977e9100243dfb9d.png