リスト内包表記

目的

要素に法則性のあるリストを作成する際にリスト内包表記(list comprehension)を使う場合がある.ここではリスト内包表記の記法を学ぶ.

説明

リスト内包表記

10個の偶数からなるリストの生成

10個の偶数からなるリストを作成するには,例えば以下のようにすればよい.

6行目で空のリストを作り,7行目で10回繰り返し,8行目で偶数をリストに追加している.このプログラムを実行すると,以下のように10個の偶数からなるリストが作られていることが確認できる.

リスト内包表記による10個の偶数からなるリストの生成

例えば10個の偶数のように規則性のある要素をもつリストを作成する方法にリスト内包表記がある.リスト内包表記の記法は以下の通りである.

list = [式 for 要素 in イテラブルオブジェクト]

リスト内包表記を使用して先程のプログラムを書き換えると,以下のようになる.

6行目がリスト内包表記であり,ここでは「range(num)」がイテラブルオブジェクト,「i」がその要素,「(i+1)*2」が式に相当する.このプログラムを実行すると,以下のように10個の偶数からなるリストが作られていることがわかる.

リスト生成時間の比較

空のリストを生成してからappendメソッドにより要素を追加する方法とリスト内包表記によりリストを生成する方法で,生成時間を比較してみよう.

7行目と11行目で,空のリストに追加する方法の開始時刻と終了時刻から処理時間を求めている.13行目と15行目で,リスト内包表記による方法の開始時刻と終了時刻から処理時間を求めている.17行目で両者の処理時間の比率を求めている.

このプログラムを実行すると,以下のようになり,リスト内包表記を使用すると,空のリストに追加する方法に比べて,7割から8割程度の処理時間でリストを作成できることがわかる.

このように,リスト内包表記では,1行の記述でリストを生成できるというメリットと,処理時間を短くできるというメリットがある.一方でコードの可読性が下がるというデメリットがある.目的に応じて使い分けると良いだろう.

リスト内包表記(後置if)

10個の偶数からなるリストの生成

以下のように,20個の整数から条件分岐を使用して偶数のみを取り出すことで,10個の偶数からなるリストを生成できる.

リスト内包表記による10個の偶数からなるリストの生成

繰り返しの中に if文による条件分岐があるような場合のリスト内包表記の記法は以下のようになり,条件を最後に指定すればよい.

list = [式 for 要素 in イテラブルオブジェクト if 条件]

先程の例をリスト内包表記で書き換えると,以下のようになる.

このプログラムを実行すると,以下のように表示され,10個の偶数からなるリストが生成されていることがわかる.

リスト内包表記(if, else文)

10個の偶数とFalseからなるリストの生成

次に,20個の整数をif, else文で条件分岐することで,偶数の場合は偶数を,奇数の場合はFalseをリストに追加してみよう.

このプログラムを実行すると,以下のように表示され,10個の偶数とFalseからなるリストを生成できることがわかる.

リスト内包表記による10個の偶数とFalseからなるリストの生成

繰り返しの中にif, else文による条件分岐があるような場合のリスト内包表記の記法は以下のようになる.

list = [真の場合の式 if 条件 else 偽のときの式 for 要素 in イテラブルオブジェクト]

先程のプログラムをリスト内包表記を使って書き換えると,以下のようになる.

このプログラムを実行すると,以下のようになり,10個の偶数とFalseからなるリストが生成されていることが確認できる.

辞書内包表記

リスト内包表記と同様に,辞書も内包表記により作成できる.

3教科のテストの点数からなる辞書の生成

例えば,以下のように,3教科の科目名からなるリストと3教科のテストの点数からなるリストから辞書を作成してみよう.

このプログラムを実行すると,以下のように表示され,3教科のテストの点数からなる辞書が作成されていることがわかる.

辞書内包表記による3教科のテストの点数からなる辞書の生成

辞書表記の記法は以下のようになる.

dictionary = [キーの式: 値の式 for 要素 in イテラブルオブジェクト]

先程のプログラムを辞書内包表記を使って書き換えると,以下のようになる.

このプログラムを実行すると,以下のように,3教科のテストの点数からなるリストが生成されていることがわかる.

課題

課題0

リスト内包表記を使用して,10個の偶数からなるリストを作成せよ.

課題1

リスト内包表記を使用して,10000000個の偶数からなるリストを作成し,リスト内包表記を使用しない方法とリスト生成にかかる時間を比較せよ.

課題2

リスト内包表記を使用して,10個の3の倍数からなるリストを作成せよ.

課題3

リスト内包表記を使用して,10000000個の3の倍数からなるリストを作成し,リスト内包表記を使用しない方法とリスト生成にかかる時間を比較せよ.

課題4

リスト内包表記を使用して,正の整数の2乗(1, 4, 9, …)10個からなるリストを作成せよ.

課題5

リスト内包表記を使用して,正の整数の2乗(1, 4, 9, …)10000000個からなるリストを作成し,リスト内包表記を使用しない方法とリスト生成にかかる時間を比較せよ.

課題6

リスト内包表記を使用して,正の整数1から10に対し,偶数の場合はその数を,奇数の場合はその数から1を引いた数をリストに追加せよ.

課題7

リスト内包表記を使用して,正の整数1から10に対し,偶数の場合はその数を,奇数の場合はその数を文字列に変換したものをリストに追加せよ.

課題8

辞書内包表記を使用して,3教科の科目名からなるリストと3教科のテストの点数から,科目名をキー・テストの点数を値とする辞書を作成せよ.

課題9

辞書内包表記を使用して,3教科の科目名からなるリストと3教科のテストの点数(100点満点)から,科目名をキー・テストの点数を値とする辞書を作成せよ.その際にテストの点数を20点満点に変換せよ.