やりたいこと
リスト内包表記に入門する。
リスト内包表記(list comprehension)とは
公式ドキュメントより抜粋
リスト内包表記はリストを生成する簡潔な手段を提供しています。
主な利用場面は、
あるシーケンスや iterable (イテレート可能オブジェクト) のそれぞれの要素に対してある操作を行った結果を要素にしたリストを作ったり、
ある条件を満たす要素だけからなる部分シーケンスを作成することです。
リストから別のリストを作成する際の便利な記法、といったもののようです。
基本の書き方
[式 for 任意の変数 in イテラブルオブジェクト]
※ イテラブルオブジェクト1
リスト内包表記の使い方
例1: 要素に処理を加え、新リスト作成
たとえば、整数からなるリスト
numbers = [1, 2, 3]
から、その要素に2をかけたリスト
double_numbers = [2, 4, 6]
を新しく作りたい場合。
従来の書き方(例)
double_numbers = []
for number in numbers:
double_numbers.append(number*2)
リスト内包表記
double_numbers = [number*2 for number in numbers]
例2: 条件を満たす要素だけ取り出し、処理を加え、新リスト作成
if文を組み合わせて、条件を満たしたもののみを取り出すこともできます。
生徒の名前と性別が格納された辞書からなるリストに対し、
男子のみの名前を取得し、新たなリストを作成するケースを考えてみます。
students = [
{'name': '太郎', 'sex': 'male'},
{'name': '花子', 'sex': 'female'},
{'name': '次郎', 'sex': 'male'}
]
から、
print(male_student_names) # ['太郎', '次郎']
となる新しいリスト「male_student_names」を作成します。
従来の書き方(例)
male_student_names = []
for student in students:
if student['sex'] == 'male':
male_student_names.append(student['name'])
リスト内包表記
male_student_names = [student['name'] for student in students if student['sex'] == 'male']
例3: ネストしたリストの平滑化
リスト内包表記では、複数のforを使用することもできます。
このしくみを、リストの平滑化に使用します。
以下のようなリストしたネスト
numbers = [[1, 2, 3], [4, 5, 6]]
を平滑化し
flat = [1, 2, 3, 4, 5, 6]
するケースを考えます。
従来の書き方(例)
flat = []
for n in numbers:
for m in n:
flat.append(m)
リスト内包表記
flat = [number for item in numbers for number in item]
参考URL
-
イテラブルオブジェクトとしては、リスト、タプル、辞書、文字列などがあります。forで繰り返し処理を行うことができます。 ↩