内包表記 | Python-izm

内包表記

Pythonではリストディクショナリをシンプルに作成する方法として内包表記があります。内包表記を用いると、複数行の記述を要する処理を1行で書けてしまうようなこともあり大変便利です。慣れていないと読みづらいと感じることもありますが、それを克服すればむしろ読みやすいと感じるはずです。

リスト内包表記

まずはリストを内包表記で作成してみましょう。書式は次の通りです。

comp_list = [<式> for <変数> in <反復可能オブジェクト>]
comp_list = [i for i in range(10)]

print(list_comp)

これは下記コードと同じ処理内容です。

comp_list = []
for i in range(10):
    comp_list.append(i)

print(comp_list)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

このように本来は3行の記述が必要な処理を1行で記述することができます。例示ソースコードの場合、一番左のiがリストの要素となりますが、これは式であるため次のようなこともできます。

comp_list = [str(i * i) for i in range(10)]

print(list_comp)
['0', '1', '4', '9', '16', '25', '36', '49', '64', '81']

ディクショナリ内包表記

次はディクショナリの内包表記です。辞書内包表記とも呼ばれます。

comp_dict = {<式(key: value)> for <変数> in <反復可能オブジェクト>}
comp_dict = {str(i): i * i for i in range(10)}

print(comp_dict)

これは下記コードと同じ処理内容です。

comp_dict = {}
for i in range(10):
    comp_dict[str(i)] = i * i

print(comp_dict)
{'1': 1, '0': 0, '3': 9, '2': 4, '5': 25, '4': 16, '7': 49, '6': 36, '9': 81, '8': 64}

セット内包表記

次はセットの内包表記です。集合内包表記とも呼ばれます。

comp_set = {<式> for <変数> in <反復可能オブジェクト>}
comp_set = {str(i * i) for i in range(10)}

print(comp_set)

これは下記コードと同じ処理内容です。

comp_set = set()
for i in range(10):
    comp_set.add(str(i * i))

print(comp_set)
{'0', '49', '64', '1', '25', '36', '4', '16', '9', '81'}

forのネスト

これまでは1つのforを内包表記で記述しましたが、ネストすることもできます。

comp_list = [i * ii for i in range(1, 10) for ii in range(1, 10)]

print(comp_list)

これは下記コードと同じ処理内容です。

comp_list = []
for i in range(1, 10):
    for ii in range(1, 10):
        comp_list.append(i * ii)

print(comp_list)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 4, …中略… 64, 72, 9, 18, 27, 36, 45, 54, 63, 72, 81]

ifとの併用

if文と併用し、条件を設けることもできます。

comp_list = [i for i in range(10) if i % 2 == 1]

print(comp_list)

これは下記コードと同じ処理内容です。

comp_list = []
for i in range(10):
    if i % 2 == 1:
        comp_list.append(i)

print(comp_list)
[1, 3, 5, 7, 9]

タプル内包表記

タプル内包表記はありません。リストやディクショナリと同じように記述することはできますが、下記のような場合はタプルではなくジェネレータが作成されます。

gen = (i for i in range(10))

print(gen)
<generator object <genexpr> at 0x000002A2839F93B8>