Categories: Python

【Python】内包表記の種類と使い方を解説

この記事では、Pythonの内包表記の使い方を解説します。

内包表記を使うことで単純なリストを高速に生成することができます。また、同じ表記方法でsetdict、 ジェネレータも生成することができます。

それでは、内包表記の使い方を見ていきましょう!

色々な内包表記

リストやセット、辞書を内包表記で生成することができます。

リスト内包表記

リスト内包表記は[]を使って以下のように記述します。

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

イテラブルオブジェクトの要素が1つずつ変数に渡され、式が繰り返し処理されます。その際、式で評価された結果がリストの要素して返されます。

サンプル

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

nums = []

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

print(nums)

実行結果

[0, 2, 4]

以下のように1行で記述可能です。

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

実行結果

[0, 2, 4]

Linklist(リスト)の使い方

セット内包表記

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

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

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

サンプル

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

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

実行結果

{0, 2, 4}

Linkset(セット)の使い方と集合演算を解説

ディクショナリ内包表記

ディクショナリ内包表記は、セット内包表記と同じ{}を使って記述します。異なる点は、式で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'}

Link辞書(マップ)の使い方【dict】

条件を指定する

以下のようにifを記述することで式が返す要素の条件を指定することができます。

[式 for 変数名 in イテラブルオブジェクト 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]]

ジェネレータ式

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

(式 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

余談: タプル内包表記は存在しない

タプル内包表記は存在しない。
()を使った内包表記は、ジェネレータ式になってしまう。

どうしてもタプルとして扱いたい場合は、リスト内包表記で生成したオブジェクトをタプルに変換することで実現できます。

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

実行結果

(0, 2, 4)

まとめ

この記事では、Pythonの内包表記について解説しました。

内包表記を使うことで低コストでリストや辞書を作成することができます。また、1行で記述することができるのでさっぱりしたコードを書くことができます。

複雑な処理をしようとすると途端に可読性が落ちるので気をつけましょう!

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

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

View Comments

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago