Python

【Python】内包表記の使い方

この記事では、Pythonの内包表記の使い方を解説します。内包表記を使うことで単純なリストを低コストで生成することができます。また、同じ表記方法でジェネレータ式も使うことができます。それでは、内包表記の使い方を見ていきましょう!

list(リスト)内包表記の使い方

リスト内包表記は以下のように記述します。

[式 for 変数名 in イテラブルオブジェクト]

通常のfor文と同様に、イテラブルオブジェクトの要素が変数名に渡され、繰り返し処理されます。その際、式で評価された結果がリストの要素して返されます。

サンプル

例えば以下のようなコードを内包表記を使って書き直すと、

nums = []

for i in range(3):
    nums.append(i*2)

print(nums)

実行結果

[0, 2, 4]

以下のようになります。

nums = [i*2 for i in range(3)]
print(nums)

実行結果

[0, 2, 4]

if句で分岐させる

以下のように記述することでif句で条件分岐させることができます。

[式 for 変数名 in イテラブルオブジェクト if 条件式]

if句の条件式がTrueの場合のみ式が評価され、要素が返されます。

サンプル

例えば、以下のコードは偶数のみを格納したリストを生成していますが、このコードを内包表記を使って書き直すと、

even = []

for i in range(5):
    if i % 2 == 0:
        even.append(i)

print(even)

実行結果

[0, 2, 4]

以下のようになります。

even = [i for i in range(5) if i % 2 == 0]
print(even)

実行結果

[0, 2, 4]

ネストしたリストの内包表記

式の部分に他の内包表記を書くことができます。

[式 for 変数名1 in イテラブルオブジェクト1 for 変数名2 in イテラブルオブジェクト2]

サンプル

例えば、以下のコードは全ての要素を2倍したリストを生成しています。このコードをネストした内包表記で書き直すと、

nums = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

double = []
for row in nums:
    double.append([num*2 for num in row])

print(double)

実行結果

[[2, 4, 6], [8, 10, 12], [14, 16, 18]]

以下のように記述できます。

double = [[num*2 for num in row] for row in nums]
print(double)

実行結果

[[2, 4, 6], [8, 10, 12], [14, 16, 18]]

set(集合)内包表記

セット内包表記は、{}を使って以下のように記述します。

{式 for 変数名 in イテラブルオブジェクト}

使い方はリスト内包表記と同じです。

サンプル

リスト内包表記のサンプルをセット内包表記で書き換えみます。

nums = {i*2 for i in range(3)}
print(nums)

実行結果

{0, 2, 4}

dictionary(辞書)内包表記

辞書内包表記は、セット内包表記同様{}を使って記述します。異なる点は、式でkey:valueと2つの値を返す必要があります。

{key:value for 変数名 in イテラブルオブジェクト}

サンプル

以下のコードでは、2つのリストから辞書を作成しています。

keys = ['key1', 'key2', 'key3']
values = ['v1', 'v2', 'v3']

d = {k:v for k, v in zip(keys,values)}
print(d)

実行結果

{'key1': 'v1', 'key2': 'v2', 'key3': 'v3'}

ジェネレータ式

内包表記に()を使うことでジェネレータ式にすることができます。

(式 for 変数名 in イテラブルオブジェクト)

使い方はリスト内包表記と変わりませんが、戻り値がジェネレータオブジェクトになっています。

サンプル

試しに、リスト内包表記と同じサンプルを実行してみます。

gen = (i*2 for i in range(3))
print(gen)

for g in gen:
    print(g)

実行結果

<generator object <genexpr> at 0x7f991491f9e0>
0
2
4

まとめ

この記事では、Pythonの内包表記について解説しました。内包表記を使うことで低コストでリストや辞書を作成することができます。また、1行で記述することができるので、さっぱりしたコードを書くことができます。しかし、複雑な処理をしようとすると途端に可読性が落ちるので気をつけましょう!

それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ

参考5.1.3. リストの内包表記 — Python 3.9.1 ドキュメント

【おすすめ】Python参考書