この記事では、Pythonの内包表記の使い方を解説します。
内包表記を使うことで単純なリストを高速に生成することができます。また、同じ表記方法でset
やdict
、 ジェネレータも生成することができます。
それでは、内包表記の使い方を見ていきましょう!
色々な内包表記
リストやセット、辞書を内包表記で生成することができます。
リスト内包表記
リスト内包表記は[]
を使って以下のように記述します。
[式 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}
ディクショナリ内包表記
ディクショナリ内包表記は、セット内包表記と同じ{}
を使って記述します。異なる点は、式で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'}
条件を指定する
以下のように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行で記述することができるのでさっぱりしたコードを書くことができます。
複雑な処理をしようとすると途端に可読性が落ちるので気をつけましょう!
それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ