Py初めてのPython

Day 3リスト・辞書(まとめて扱う)=AIとの接点

内包表記の読み方と、APIレスポンスから欲しい値を取り出す

内包表記を読めるようにし、ネストしたAPIレスポンスから必要な値を抜き出す。

内包表記は「forを1行に畳んだもの」

Pythonのコードやサンプルでは、リスト内包表記(list comprehension)という書き方が頻繁に出てきます。これはforループでリストを作る処理を1行にまとめた省略記法です。書けなくてもいいので、読めるようになりましょう。

普通のfor(縦に長い)

PYTHON
nums = [1, 2, 3, 4]
doubled = []
for n in nums:
    doubled.append(n * 2)
# [2, 4, 6, 8]

内包表記(1行)

PYTHON
nums = [1, 2, 3, 4]
doubled = [n * 2 for n in nums]
# [2, 4, 6, 8]

読み方のコツは、真ん中の for から読むことです。[n * 2 for n in nums] は「nums の各 n について、n * 2 を集めた新しいリスト」と読みます。左側が「集める中身」、右側が「どこから取るか」です。

PYTHON
scores = [80, 55, 90, 40]
passed = [s for s in scores if s >= 60]
print(passed)  # [80, 90]
末尾に if を足すと条件で絞り込める
  1. まず右の for ... in ... を見て、何を1件ずつ取るか把握する
  2. 末尾に if があれば、その条件で絞られる
  3. 最後に左の式が、各要素をどう変換するかを表す

読めれば十分、無理に短くしない

内包表記は便利ですが、条件やネストを詰め込みすぎると一気に読めなくなります。自分で書くときは、複雑になりそうなら普通のforで書く方が、後で読む人(未来の自分やAI)に親切です。

実践: APIレスポンスから欲しい値を取り出す

総仕上げです。JSONを辞書に変換し、ネストを掘り、内包表記で欲しい値だけを集めます。Day3で学んだことが全部つながります。

PYTHON
import json

response = '''
{
  "users": [
    {"name": "田中", "age": 28},
    {"name": "佐藤", "age": 17},
    {"name": "鈴木", "age": 35}
  ]
}
'''

data = json.loads(response)          # 文字列 -> 辞書
users = data["users"]                # リストを取り出す

names = [u["name"] for u in users]   # 名前だけ集める
adults = [u["name"] for u in users if u["age"] >= 18]

print(names)   # ['田中', '佐藤', '鈴木']
print(adults)  # ['田中', '鈴木']
変換 -> ネストを掘る -> 内包表記で抽出、の3ステップ

この流れが実務の型

APIから受け取る、辞書に変換する、必要な部分まで [ ] で掘る、リストを内包表記やforで加工する。この一連の流れは、AIのAPIを使うときも他のWebサービスを使うときもほぼ同じです。ここを自分の手で追えることが目標でした。

AIにはこう聞く

「このJSONから18歳以上の名前だけをPythonで取り出すコードを書いて」と頼めばコードは出ます。あなたの役割は、u["age"] のキー名が実際のデータと合っているか、条件が >= 18 で正しいか(17歳が除外され18歳が含まれるか)を読んで確かめることです。境界の1歳のずれをAIが間違えることもあります。

読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。

理解度チェック

答えられれば、面接で説明できる状態に一歩近づきます。

Q1

nums = [1, 2, 3, 4] のとき、[n for n in nums if n % 2 == 0] の結果はどれですか。

Q2

users がユーザー辞書のリストのとき、各ユーザーの名前だけを集める内包表記はどれですか。

Q3

APIのJSONレスポンスから欲しい値を取り出す手順を、Day3で学んだ言葉を使って順に説明してください。

記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。