連載
» 2019年08月28日 05時00分 公開

機械学習&ディープラーニング入門(Python編):Lesson 16 リスト内包表記 ― Python言語の文法(応用編)

本連載では、コードを書く流れに沿ってPython言語の基礎文法を説明してきた。今回は、応用的だが、利用頻度が高く重要な文法として、リスト内包表記を紹介する。

[一色政彦,デジタルアドバンテージ]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「機械学習&ディープラーニング入門(Python編)」のインデックス

連載目次

ご注意:本記事は、@IT/Deep Insider編集部(デジタルアドバンテージ社)が「deepinsider.jp」というサイトから、内容を改変することなく、そのまま「@IT」へと転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。

 Python言語の文法のうち、応用的だが押さえておいてほしいものをいくつか、具体的には、

  • if 条件式(Lesson 14)
  • and/or/not 論理演算子(Lesson 14)
  • ラムダ式(Lesson 15)
  • リスト内包表記(Lesson 16)
  • 例外(Lesson 17)

の5項目を紹介してから終わりとしたい。これらは、Pythonのサンプルコードを読む際に出くわす可能性が特に高く、しかも知らないと非常に難解そうなコードに思えてしまうものたちである。そのうち今回は、「リスト内包表記」について説明する。脚注や図、コードリストの番号は前回からの続き番号としている。

 なお、本稿で示すサンプルコードの実行環境については、Lesson 1を一読してほしい。

 Lesson 1でも示したように、本連載のすべてのサンプルコードは、下記のリンク先で実行もしくは参照できる。


Google Colabで実行する
GitHubでソースコードを見る

Python言語の文法(応用編)

リスト内包表記

 ディープラーニングなどの実装の際に好まれて使用されているが、書き方が少し複雑な短縮記法が、リスト内包表記である。

 Lesson 10のリスト13-1で説明した「for文によるループ処理」(以下、forループ)を思い出してほしい。これは、リスト値などのコレクションの中身を、最初(=リスト値ではインデックス番号「0」)から順に、1つずつ処理を進めていくための文法だった。リスト内包表記を使うと、このforループを短く記述できる。

 例として今回は、5個の要素を持つリスト値に対して、「インデックス番号+1」(つまり1スタート)の数値を出力するコードを作成してみよう。これはリスト21-1のようなコードになる。

for i in range(5):
  print(i+1)

# 1
# 2
# 3
# 4
# 5

リスト21-1 for文によりループ処理を記述したコード例

 これをリスト内包表記で書き換えてみる。すると、リスト21-2のように記述できる。

[print(i+1) for i in range(5)]
# 1
# 2
# 3
# 4
# 5

# もちろん以下のように変数に代入することも可能
new_list = [i+1 for i in range(5)]
print(new_list)  # [1, 2, 3, 4, 5]

リスト21-2 リスト内包表記によりループ処理を記述したコード例

 リスト内包表記の構文は図12のようになっている(リスト21-2の下から2行目のコードを説明対象とした)。

リスト内包表記の構文 図12 リスト内包表記の構文

 まずは、new_list = ・・・・・・という「変数の宣言と代入」があるのが分かる。このようにリスト内包表記は、[]による「リストの宣言」として記述するので、宣言された新規リスト値(新しいコレクション)は変数new_listに代入できるというわけだ。

 次に、[]内の、for式の前までの部分、つまりi+1という式を見てほしい。これは、forループで処理内容を書くためのブロック部分に相当する箇所だ。リスト内包表記では、ここに(改行を必要とする)文ではなく式を記載すると、ループ処理で1つずつ順にその式が実行されることになる。式の実行結果の値(この例ではi+1の結果値)は、新規リスト値を構成する各要素の値となる。今回の例では、12345という各処理での結果値で構成される新規リスト値が生成されることになる。

 さらに、[]内の、for式の後からの部分、つまりfor i in range(5)という式を見てほしい。これは、forループで、ループ方法を記載した1行目の部分と同じだ。最後にコロン(:)がないこと以外はLesson 10で説明した内容と同じで、for <変数> in <コレクション>という構文になっている。インデックスとなる変数iには、コレクションrange(5)(=[0, 1, 2, 3, 4]というリスト値)内の各要素の数値が前から順番に代入されていく。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。