当サイトは、アフィリエイト広告を利用しています
pythonでリストを生成する時に
よく使うリスト内包表記について調べたので忘備録として残す
リスト内包表記を使うことで通常のループや関数を使ってリストを作成するよりも、
コードを短く、可読性を高めることができる。
リスト内包表記は反復可能オブジェクトから新しリストを作ることができる
リスト作成方法のこと。
たとえば
など色々なリストを作ることができる。
反復可能オブジェクトは、要素を順番に取り出すことができるもので
具体的な下記が該当する
リスト内包表記の基本構文は
[式 for 変数 in iterable if 条件]
実際にオブジェクトリストからリスト内包表記を使って
様々な条件のリストを生成してみる。
users = [{"user_id": "1", "name": "Tujimura", "age": 11},{"user_id": "2", "name": "mori", "age": 20},{"user_id": "3", "name": "shimada", "age": 50},{"user_id": "4", "name": "kyogoku", "age": 70}]
上記からリスト内包表記を使って新しいリストを生成する。
users = [{"user_id": "1", "name": "Tujimura", "age": 11},{"user_id": "2", "name": "mori", "age": 20},{"user_id": "3", "name": "shimada", "age": 50},{"user_id": "4", "name": "kyogoku", "age": 70}]user_names = [user["name"] for user in users]print(user_names) # ['Tujimura', 'mori', 'shimada', 'kyogoku']
ユーザー名だけのリストが生成できる
動作確認
users = [{"user_id": "1", "name": "Tujimura", "age": 11},{"user_id": "2", "name": "mori", "age": 20},{"user_id": "3", "name": "shimada", "age": 50},{"user_id": "4", "name": "kyogoku", "age": 70}]adult_users = [user for user in users if user["age"] >= 20]print(adult_users)# [{'user_id': '2', 'name': 'mori', 'age': 20}, {'user_id': '3', 'name': 'shimada', 'age': 50}, {'user_id': '4', 'name': 'kyogoku', 'age': 70}]
20歳以上のオブジェクトだけのリストができる
動作確認
users = [{"user_id": "1", "name": "Tujimura", "age": 11},{"user_id": "2", "name": "mori", "age": 20},{"user_id": "3", "name": "shimada", "age": 50},{"user_id": "4", "name": "kyogoku", "age": 70}]older_users_names = [user["name"] for user in users if user["age"] >= 50]print(older_users_names) # ['shimada', 'kyogoku']
50歳以上のオブジェクトの名前だけのリストができる
動作確認
users = [{"user_id": "1", "name": "Tujimura", "age": 11},{"user_id": "2", "name": "mori", "age": 20},{"user_id": "3", "name": "shimada", "age": 50},{"user_id": "4", "name": "kyogoku", "age": 70}]user_name_age = [(user["name"], user["age"]) for user in users]print(user_name_age)# [('Tujimura', 11), ('mori', 20), ('shimada', 50), ('kyogoku', 70)]
名前と年齢だけのタプルができる
動作確認
users = [{"user_id": "1", "name": "Tujimura", "age": 11},{"user_id": "2", "name": "mori", "age": 20},{"user_id": "3", "name": "shimada", "age": 50},{"user_id": "4", "name": "kyogoku", "age": 70}]user_dict = {user["user_id"]: user["name"] for user in users}print(user_dict)# {'1': 'Tujimura', '2': 'mori', '3': 'shimada', '4': 'kyogoku'}
user_idをキー、名前をバリューにもつオブジェクトのリストができる
動作確認
users_A = [{"user_id": "1", "name": "Tujimura", "age": 11},{"user_id": "2", "name": "mori", "age": 20},{"user_id": "3", "name": "shimada", "age": 50},{"user_id": "4", "name": "kyogoku", "age": 70}]users_B = [{"user_id": "3", "name": "shimada", "age": 50},{"user_id": "4", "name": "kyogoku", "age": 70}]# user_id が一致しているオブジェクトだけを取得するresult = [user_Afor user_A in users_Aif any(user_A["user_id"] == user_B["user_id"]for user_B in users_B)]print(result)# [{'user_id': '3', 'name': 'shimada', 'age': 50}, {'user_id': '4', 'name': 'kyogoku', 'age': 70}]
※はany()は条件に一致してるものがひとつでもあればtrueを返す
pythonで色々な条件でリストを生成できるリスト内包表記の使い方について
実装しながらまとめてみた。
実装してみた思ったがかなり汎用性が高い。
高階関数(map等)でも同じことができるがリスト内包表記の方が高速なので
こちらを使った方がよさそう。