names = [user.get('name') for user in users if user.get('age') > 18]
これを見ると、__ムカつきを覚える人__が対象です。
リスト内包表記の書き方を解説します。
いつ使う:既存の配列から新たな配列を作る
まず、どんな実装をするときにリスト内包表記を使うか考えましょう。
ずばり、「既存の配列から新たな配列を作るとき」です。
リスト内包表記を使わないサンプルコードを見ていきましょう。
ユーザー情報のリストからユーザー名のみを抽出してユーザー名のリストを作成するコードです。
users = [{'name': 'masaki', 'age': 20}, {'name': 'hiroshi', 'age': 24}]
names = [] # =====ここから=====
for user in users:
names.append(user.get('name')) # =====ここまで=====
サンプルコードでここから~ここまで と書いているところが、リスト内包表記を使うと一行になります。
users = [{'name': 'masaki', 'age': 20}, {'name': 'hiroshi', 'age': 24}]
names = [user.get('name') for user in users]
こんな感じで、一行にできました。
リスト内包表記を書くときのポイントは、for user in users
の部分から書き始めることです。
# forを回したい対象は -> users
[for user in users]
ここまでは普通のfor文の書き出しと一緒です。
# forを回したい対象は -> users
[user.get('name') for user in users]
そして、userに何をしたいか、対象の処理を書けば良いだけ。
コードの前から見ていくと何をしているのか分かりにくくなってしまいます。
なので、慣れないうちは__for文から__見る・書くことをオススメします。
ifがつくパターン
names = [user.get('name') for user in users if user.get('age') > 18]
そして、先ほどのコードにプラスして条件が書かれることもあります。
こちらの条件は、条件がtrueであれば配列に追加することになります。
users = [{'name': 'masaki', 'age': 20}, {'name': 'hiroshi', 'age': 24}, {'name': 'satoru', 'age': 15}]
names = [user.get('name') for user in users if user.get('age') > 18]
print(names) # -> ['masaki', 'hiroshi']
こちらも先ほどと同じ。
順序だてて書いていきましょう。
[user.get('name') for user in users]
このコードに、条件を追加するだけです。
[user.get('name') for user in users if user.get('age') > 18]
以下の手順で書いていきましょう。
- for in の部分を書く
- user.get('name')の、何をリストに入れたいかを書く
- リストに入れる際に条件があればif文を書く
少しでも苦手意識が無くなれば幸いです。