[Python Tips]内包表記をマスターする!

Pythonには内包表記と言う記法が存在します。
一般にfor文を用いて複数行で記述するコードを一行で記述する記法です。
内包表記の基本記法
内包表記はいくつかのコンテナ型に利用することができます。
リスト
最も目にする機会が多いのはリストです。普通のfor文記法で書くと次のようになります。
a = []
for i in range(1, 10):
a.append(i**2)
print(a)
# [1, 4, 9, 16, 25, 36, 49, 64, 81]
これを内包表記を用いて書き直すと次のようになります。内包表記を利用することでコードが簡潔になりました。
a = [i**2 for i in range(1, 10)]
print(a)
# [1, 4, 9, 16, 25, 36, 49, 64, 81]
集合
集合の場合もリストと同様です。もちろん、集合であるため同一要素があった場合も重複はしません。
s = {i%7 for i in range(1, 10)}
print(s)
# {0, 1, 2, 3, 4, 5, 6}
辞書
辞書の場合はkeyとvalueが必要となるため、値の部分に[key]: value
の形で記述する必要があります。
key = ["k1", "k2", "k3", "k4", "k5"]
value = [0, 1, 2, 3, 4]
d = {k: v for k, v in zip(key, value)}
print(d)
# {'k1': 0, 'k2': 1, 'k3': 2, 'k4': 3, 'k5': 4}
内包表記を使いこなす
内包表記は単純なfor文で要素を格納する以外の操作も可能です。
条件付き
次のコードは24の約数をリストに格納するコードです。リストに格納する条件があるfor文にも内包表記を用いることができます。
a = []
n = 24
for i in range(1, n + 1):
if n % i == 0:
a.append(i)
print(a)
# [1, 2, 3, 4, 6, 8, 12, 24]
後ろにif文を記述することで格納に条件をつけることができます。
n = 24
a = [i for i in range(1, n + 1) if n % i == 0]
# [1, 2, 3, 4, 6, 8, 12, 24]
条件分岐
次のコードは1から順番の整数を偶数だけ-1をかけて格納した配列を作るものです。
リストに格納する値が条件によって変化するfor文にも内包表記を用いることができます。
a = []
for i in range(1, 10):
if i % 2:
a.append(i)
else:
a.append(-i)
print(a)
# [1, -2, 3, -4, 5, -6, 7, -8, 9]
前にif-else文を記述することで条件によって格納する値を変化させることができます。
a = [i if i % 2 else -i for i in range(1, 10)]
二重for文
次のような二重for分も内包表記を用いて書くことができます。
a = []
x = ["a", "b", "c"]
y = ["1", "2"]
for i in x:
for j in y:
a.append(i + j)
print(a)
# ['a1', 'a2', 'b1', 'b2', 'c1', 'c2']
二つのfor文がどちらが先に実行されるか注意してください。順番を間違えると格納順が変わります。
x = ["a", "b", "c"]
y = ["1", "2"]
a = [i + j for i in x for j in y]
# ['a1', 'a2', 'b1', 'b2', 'c1', 'c2']
内包表記を使うことは基本的にPythonic(Pythonらしいコード)だとされていますが、二重ループに条件分岐や条件付きが混じったものなどを記述するとどうしても可読性は下がってしまいます。
単に使えばいいと思わず、より可読性の高いコードを心がけていきましょう!
a = [[j for j in range(i)] for i in range(5) if i % 2]
print(a[1])
>Python TIPSのほかの記事を読む
>開発者ブログのほかの記事を読む
ライター:H.I