post Image
リスト内包表記とif文を組み合わせるとき

はじめに

二番煎じかもしれないけど、よくリスト内包表記でわからなくなるのでメモ。

リスト内包表記

Pythonではリストを作るとき、appendを呼び出さないためにfor文より実行速度が速い、リスト内包表記というものがあります。
その代わりコードの可読性を著しく損なうという副作用がありますが、ワンライナーで書きやすいので私はよく使います。

if … のみを使うとき

次のコードは9までの偶数のみを返すリスト内包表記です。

even_list = [i for i in range(10) if i % 2 == 0]

普通にfor文で書くと以下のようになります。

even_list = []
for i in range(10):
    if i % 2 == 0:
        even_list.append(i)

elseを使わないときはifをリスト内包表記の後に持ってくるのがポイント。
even_listの中身は、以下のようになります。

[0, 2, 4, 6, 8]

このひとつの特徴としては、内包表記の最後に現れるif文によって、range(10)で10個あった数が選択され、要素数が減っています。

if … else … を使うとき

次のコードは偶数のときは数字、奇数のときは “odd” を返すリスト内包表記です。

even_list = [i if i % 2 == 0 else "odd" for i in range(10)]

for文を使った例

even_list = []
for i in range(10):
    if i % 2 == 0:
        even_list.append(i)
    else:
        even_list.append("odd")

elseを使いたいときは、if文をリスト内包表記の一番前に書く必要があります。
even_listの中身は、以下のようになります。

[0, 'odd', 2, 'odd', 4, 'odd', 6, 'odd', 8, 'odd']

こちらは、else文があることによって、if文の条件に合致しなかった場合でも値が返ってくるので、要素数は減っていません。

補足

これはPythonの三項演算子(Pythonでは正しくは条件式と呼ぶみたいです)とを使っていて、

"even" if True else "odd"

のときに “even” が返ってくるのと同じ。
それをリスト内包表記のforの中で使っているだけです。

まとめ

else の有無 位置 構文 要素数
if … のみを使うとき ifは後ろ [ … for … in … if … ] ifの条件に合致しないと要素が減る
if … else … を使うとき ifは [ … if … else … for … in … ] 要素数は減らない

… if … else … を三項演算子と呼ばないことや要素数関係の話は@shiracamus さんにご指摘頂きました。
それを基に加筆修正してあります。
いつもコメントありがとうございます。


『 Python 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。