Pythonの内包表記を初心者向けに解説。リスト・集合・辞書内包表記【Python tips】

Python

独習Python [ 山田 祥寛 ]

 

こんちには、monachan_papaです。
今回は Python の大変便利な記法である内包表記について、初心者に向けて解説します。

内包表記は初心者にはとっつきが悪く、初期学習の段階では敬遠しがちです。確かに、その気持ちは非常によく分かります。
「内包表記、読みにくいなあ。非論理的にしか見えん!」というのが最初の印象でした。しかし、慣れてくるとこれがまあ大変便利なこと便利なこと。超おすすめします。

本テーマを読むことにより、

  • 内包表記とは何か
  • 内包表記の仕組み
  • 内包表記の書き方
  • 内包表記のメリット

以上のことが理解できるようになり、内包表記マスターへの第1歩を進めることができます。

内包表記とは?

内包表記とは、既存の反復可能体から新しい反復可能体を生成する便利な記法です。
反復可能体には「リスト、集合、辞書」などの繰り返し可能なオブジェクトがあり、それぞれ 内包表記、集合内包表記、辞書内包表記 と呼ばれています。

そして、内包表記を使う最大のメリットは何か?

オブジェクトを簡潔かつ高速に生成し、コードもすっきり!

基本的にリスト内包表記を覚えると、他の内包表記もすんなり理解できていくと思うので、まずはリスト内包表記をしっかりと理解しましょう。

リスト内包表記

基本系

リスト内包表記は、既存の反復可能体の各要素に対して処理を行い、新しいリストを生成します。
以下のコードは、変数test の各要素に対して2倍にする処理を行い、新しいリストを生成しています。

test = [1, 2, 3, 4, 5]
[i * 2 for i in test]
[2, 4, 6, 8, 10]

 

[変数に対する処理 for 変数 in 既存の反復可能体]

リスト内包表記の基本形は上記の通りですが、初心者が敬遠してしまうのは、1行の中ですべて簡潔していて、しかも同じ変数が何度も書かれているところかと思います。そして、for文と言えば、普通は2行目から処理を書くのが頭の中にこびりついているからだと思います。

この呪縛を解くのに一番手っ取り早い方法を提案します。

1. まずは「for 変数 in 既存の反復可能体」だけを書く。
2. 上で書いたコードの先頭に「変数に対する処理」を書き足す。
3. 最後に角括弧を両側に書く。

泥臭いですが、呪縛をいきなり解くのはキツいかと思うので、これがゆるく呪縛を解く方法かと思います。
内包表記に慣れてきたら、いきなり角括弧から書き始めれば良いと思います。

さて、さきほどのコードをもし内包表記を使わないで書いたらどうなるか?
以下のようになります。

test = [1, 2, 3, 4, 5]
datas = []
for i in test:
    datas.append(i)
datas
[1, 2, 3, 4, 5]

長い!リスト内包表記を使った方が、圧倒的にスッキリしているのがよく分かると思います。

if文との連携

リスト内包表記は、if文と連携して書くことが可能です。これは例えば、リストの中から特定条件にマッチする要素だけを抽出したい、というシーン等において重宝します。
以下のコードは、変数testの要素の中から 0 でない要素だけを抽出して、それらを10倍した新しいリストを生成しています。

test = [0, 0, 0, 1, 2]
[i * 10 for i in test if i != 0]
[10, 20]

 

[変数に対する処理 for 変数 in 既存の反復可能体 if 変数に対する条件]

集合内包表記

基本形

集合内包表記は、既存の反復可能体の各要素に対して処理を行い、新しい集合を生成します。
以下のコードは、変数testの各要素に対して2倍にする処理を行い、新しい集合を生成しています。

test = [1, 2, 3, 4, 5, 5, 5]
{i * 2 for i in test}
{2, 4, 6, 8, 10}

 

{変数に対する処理 for 変数 in 既存の反復可能体 if 変数に対する条件}

if文との連携

集合内包表記は、if文と連携して書くことが可能です。これは例えば、リストの中から特定条件にマッチする要素だけを抽出したい、というシーン等において重宝します。
以下のコードは、変数testの要素の中から 0 でない要素だけを抽出して、それらを10倍した新しい集合を生成しています。

test = [0, 0, 1, 2, 2]
{i * 10 for i in test if i != 0}
{10, 20}

 

{変数に対する処理 for 変数 in 既存の反復可能体 if 変数に対する条件}

辞書内包表記

基本形

辞書内包表記は、既存の反復可能体の各要素に対して処理を行い、新しい辞書を生成します。
以下のコードは、キーに「変数testの各要素」、に「各要素×2」を持った新しい辞書を生成しています。

test = [1, 2, 3, 4, 5]
{k: k*2 for k in test}
{1: 2, 2: 4, 3: 6, 4: 8, 5: 10}

 

{キー: 値 for 変数 in 既存の反復可能体}

if文との連携

辞書内包表記は、if文と連携して書くことが可能です。これは例えば、リストの中から特定条件にマッチする要素をキー、値を要素の10倍にしたい、というシーン等において重宝します。
以下のコードは、キーに「変数testの各要素で 0 でない要素」、に「0 でない要素×10」を持った新しい辞書を生成しています。

test = [0, 1, 2, 3, 4, 5]
{k: k*10 for k in test if k != 0}
{1: 10, 2: 20, 3: 30, 4: 40, 5: 50}

 

{キー: 値 for 変数 in 既存の反復可能体 if 変数に対する条件}

辞書のitemsメソッドとの連携

既存の辞書に何らかの処理をして新しい辞書を生成したいシーンがあるとき、辞書内包表記と辞書のitemsメソッドを連携すると便利です。
以下のコードは、キーに「変数testの各要素のキー」、に「各要素の値×2」を持った新しい辞書を生成しています。

test = {'A': 1, 'B': 2, 'C': 3}
{k: v*2 for k, v in test.items()}
{'A': 2, 'B': 4, 'C': 6}

zip関数との連携

組み込み関数の zip関数を使用すると、2つのリストから辞書生成ができます。
例えば、AリストとBリストがあったとき、キーに「Aリストの要素」、に「Bリストの要素」をもった新しい辞書を生成することができます。
以下は、そのコード例です。

A = ['ピ', 'コ', '太', '郎']
B = [0, 1, 2, 3]
{k: v for k, v in zip(A, B)}
{'ピ': 0, 'コ': 1, '太': 2, '郎': 3}

内包表記は本当に速いの?

色々な内包表記の例を見てきて、シンプルに書けることは明らかになったと思います。あとは速さです。
ここで実際に速度計算をして、その速さを体感してみたいと思います。

0 から 9999 までの等差数列になったリスト

これをリスト内包表記で生成する場合、普通のfor文で生成する場合で検証します。
速度計測は Jupyter Lab や Jupyter Notebook で、セルの先頭にマジックコマンドである %%timeit を書きます。そして、そのすぐ下に計測したい処理を書くだけで実現可能です。

まずは、内包表記。

%%timeit
datas = [i for i in range(10000)]
297 µs ± 665 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)

続いて、普通の for文。

%%timeit
datas = []
for i in range(10000):
    datas.append(i)
514 µs ± 1.38 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
  • 内包表記: 297 µs
  • 普通のfor文: 514 µs
514/278
1.8489208633093526

内包表記は、約1.8倍も速いと結果が出ました。


 

以上で、内包表記についての解説はおしまいです。
Python をやっている以上、内包表記が書けるということは、通っぽく見せるためにも絶対に必要だと思います。是非、使いこなしていただきたいと思います。

さて、もっと内包表記について詳しくなりたい!という御方には、独習Python [ 山田 祥寛 ]が大変おすすめです。
ここで紹介したリスト、集合、辞書の内包表記はもちろん網羅されていますし、より実践的な内容が学べると思います。内包表記マスターを目指してくださいね。


独習Python [ 山田 祥寛 ]

 

また、爆速で 内包表記を含めPython を学びたい御方にはプログラミングスクールを考えるのも、ひとつの手です。独学よりも効果が出やすいですが、いかんせん投資がけっこうかかります。しかし、techgymというスクールは通うか通わないかは別として、無料のサンプルテキスト&解説動画がもらえます。これをとりあえず getしてまずは試しに体験学習するのもありでしょう。

コメント

タイトルとURLをコピーしました