IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

ゼロから歩くPythonの道

CTC 教育サービス

 [IT研修]注目キーワード   Python  Power Platform  最新技術動向  生成AI  Docker  Kubernetes 

第66回 Pythonプログラムでエラーを出す前に確認したいこと ~リスト内包表記編~ (菱沼佑香) 2025年8月

こんにちは、吉政創成 菱沼です。
今回も「きれいなPythonプログラミング(マイナビ出版)」という書籍を利用して学習します。

現在学習中の5章「怪しいコード臭」では、バグを未然に防ぐために、どういった点に注意した方が良いのか、対処するか否かの判断について学んでいます。
今回はリスト内包表記(P.82)です。

内包表記とは?

内包表記には、リスト(list)、集合(set)、辞書(dict)があるそうです。
それぞれの書式は若干異なるものですが、この内包表記を使うと複数行のコードを1行にまとめることができるようになります。
それぞれの用途や特徴、構文は下表にまとめてみました。

内包表記 用途 重複 順番 構文(下段は条件付き)
リスト(list) 条件を満たす値をすべて保管 あり あり [式 for 変数 in イテラブル]
[式 for 変数 in イテラブル if 条件]
集合(set) 値の重複をなくして保管 なし なし {式 for 変数 in イテラブル}
{式 for 変数 in イテラブル if 条件}
辞書(dict) キーと値を紐づけて保管 キーの重複無 あり ※ {キー: 値 for 変数 in イテラブル}
{キー: 値 for 変数 in イテラブル if 条件}

※ )Python3.7以降
補足1)イテラブル:繰り返し処理(ループ)に使えるもの
補足2)if-elseについては後ほど補足内に記載します。

では具体的にどう書くのか、まずはテキストにあったサンプルコードを実行してみました。

<普通の表記>

fig01

<リスト内包表記>

fig02

結果は同じですが、上のものは4行に対し、リスト内包表記を使ったものは1行で書くことができます。

<集合内包表記>

fig03

重複は許さぬが順番はどうでもいい派らしく、並びは適当です。

<辞書内包表記>

fig04

集合と辞書は、ハッシュテーブルとして実装されているのだとか。ハッシュテーブルとは、キーからすぐに値を見つけられる仕組みのことで、検索がとても速いのが特長だそうです。ハッシュの結果は内部処理で決まるんだそうで、順番には意味がないらしいです。うーむ。

補足)
個人的にどうしても理解ができずに躓いているリスト内包表記...。
例えばappendはどこに行ってしまったの...とか考えてしまうのですが、そもそもリスト内包表記自体が新しいリストを作るためのものなので、appendを使って手動で追加せずとも値(ここではstr(number))を自動でリストに入れてくれるのだそうです。なのでappendは不要だと。

ついでにifが後ろにいるのもなんだか気持ちが落ち着かない原因だと思われます。。
後ろにいるのはifの条件を満たした場合にリストに値を入れるという動作になるため、forのでその値を「入れるかどうか」決めるからだそうです。
ちなみにelseが入っていた場合は、if~elseまでが一つの式として扱われるので、構文は[値1 if 条件 else 値2 for 変数 in データ]なり、この時のforは後ろにくるんだそうです...。これはfor ので「何を入れるか」を決める必要があるからなのだとか。何ともややこしい。

ある方に内包表記のコツを聞いてみたところ、まずは一度、普通の表記で書いてみて、内包表記の書き方にあてはめるというのを繰り返すとアドバイス頂きました。慣れるしかないということですが、なんにせよややこしいですね...という思いです。

内包表記の注意点、何事もほどほどに。

内包表記の基本について長くなりましたが...
さて、そんな内包表記での注意点ですが、重ねて使う場合に気を付ける必要があるようです。

---------------------------------------------------------------
P.83
内包表記は簡潔で、コードの可読性を高めることができます。しかし、内包はイテレート可能なオブジェクト(この例では、range(100)によって返されるrangeオブジェクト)に基づいて、リスト、集合、辞書を生成することに注意してください。リスト、集合、辞書はイテレート可能なオブジェクトであるため、次の例のように内包表記の中に内包表記を入れることができます。

fig05

しかし、入れ子になったリスト内包(または集合内包や辞書内包)は、短いコードにたくさん詰め込みすぎてコードが読みにくくなってしまいます。その場合はforループに展開する方がよいでしょう。

fig06

---------------------------------------------------------------

ただでさえ苦手な内包表記のハードルが上がった気がしてなりません。が、見にくいと思うのは私だけでないようで、無理に重ねて内包表記にしなくてもいいということで安心いたしました。
また、forを重ねることもできるそうですが、これもまたわかりにくいので、おすすめはしないようです。
こちらがサンプル。入れ子になっているリストをフラット化するもので、二つのfor文が入っています。

---------------------------------------------------------------
P.83、84

fig07

(中略)
次のforループを使った場合でも同じフラット化されたリストが作成されますが、より読みやすくなっています。

fig08

内包表記は、簡潔なコードを生成することができる構文上のショートカットですが、入れ子にするのはやりすぎです。
---------------------------------------------------------------

何事もほどほどと...。コードが短くなれば処理速度があがるものの、理解しやすいかは別ということで、誰が読んでもわかりやすい形で書けるようになりたいです。
それではきりが良いので、今回はこちらで終了です。今回もお付き合いいただきありがとうございました。

 

 [IT研修]注目キーワード   Python  Power Platform  最新技術動向  生成AI  Docker  Kubernetes