機械学習 & ディープラーニング入門(Python編)[Lesson 16]

機械学習 & ディープラーニング入門(Python編)[Lesson 16]

リスト内包表記 ― Python言語の文法(応用編)

2019年8月28日

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

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

 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のようなコードになる。

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

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

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

Python
[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]というリスト値)内の各要素の数値が前から順番に代入されていく。

 なお、新規リスト値を変数に代入しなくても、リスト21-2の1行目に示したように、[print(i+1) for i in range(5)]のようにしてループ処理だけすることも可能である。しかしループ処理だけであれば、forループを使う方が、目的と記法が合致しており好ましい。つまり、リスト21-1のコードは実際にはリスト内包表記に書き換えない方がいい。

 リスト内包表記は、「ループ処理により生成した結果値を、何らかの新規リスト値にまとめ直したい」といった目的で使うのが好ましい。このような目的は、機械学習やディープラーニングでは多々あるので、リスト内包表記はよく使われている。

つづく

 今回は、リスト内包表記について説明した。次回は、例外について紹介する。

  • このエントリーをはてなブックマークに追加

※以下では、本稿の前後を合わせて5回分(第14回~第18回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載目次]を参照してください。

機械学習 & ディープラーニング入門(Python編)[Lesson 16]
14. if 条件式、and/or/not 論理演算子 ― Python言語の文法(応用編)

本連載では、コードを書く流れに沿ってPython言語の基礎文法を説明してきた。今回は、応用的だが、利用頻度が高く重要な文法として、if条件式とand/or/not論理演算子を紹介する。

2019年8月25日(日)
機械学習 & ディープラーニング入門(Python編)[Lesson 16]
15. ラムダ式 ― Python言語の文法(応用編)

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

2019年8月26日(月)
機械学習 & ディープラーニング入門(Python編)[Lesson 16]
16. 【現在、表示中】≫ リスト内包表記 ― Python言語の文法(応用編)

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

2019年8月28日(水)
機械学習 & ディープラーニング入門(Python編)[Lesson 16]
17. 例外 ― Python言語の文法(応用編)

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

2019年8月30日(金)
機械学習 & ディープラーニング入門(Python編)[Lesson 16]
18. 「Python言語基礎文法」と「いくつかの応用文法」のまとめ

コードを書く流れに沿って説明してきたPython言語の基礎文法と、いくつかの応用文法のポイントを箇条書きでまとめる。

2019年8月31日(土)
Deep Insider の SNS :

本コンテンツの目次

機械学習 & ディープラーニング入門(Python編)[Lesson 16]
機械学習 & ディープラーニング入門(Python編)[Lesson 16]

リスト内包表記 ― Python言語の文法(応用編)


本コンテンツに関連する重要用語