Day 3・リスト・辞書(まとめて扱う)=AIとの接点
内包表記の読み方と、APIレスポンスから欲しい値を取り出す
内包表記を読めるようにし、ネストしたAPIレスポンスから必要な値を抜き出す。
内包表記は「forを1行に畳んだもの」
Pythonのコードやサンプルでは、リスト内包表記(list comprehension)という書き方が頻繁に出てきます。これはforループでリストを作る処理を1行にまとめた省略記法です。書けなくてもいいので、読めるようになりましょう。
普通のfor(縦に長い)
nums = [1, 2, 3, 4]
doubled = []
for n in nums:
doubled.append(n * 2)
# [2, 4, 6, 8]内包表記(1行)
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 を集めた新しいリスト」と読みます。左側が「集める中身」、右側が「どこから取るか」です。
scores = [80, 55, 90, 40]
passed = [s for s in scores if s >= 60]
print(passed) # [80, 90]- まず右の for ... in ... を見て、何を1件ずつ取るか把握する
- 末尾に if があれば、その条件で絞られる
- 最後に左の式が、各要素をどう変換するかを表す
読めれば十分、無理に短くしない
内包表記は便利ですが、条件やネストを詰め込みすぎると一気に読めなくなります。自分で書くときは、複雑になりそうなら普通のforで書く方が、後で読む人(未来の自分やAI)に親切です。
実践: APIレスポンスから欲しい値を取り出す
総仕上げです。JSONを辞書に変換し、ネストを掘り、内包表記で欲しい値だけを集めます。Day3で学んだことが全部つながります。
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) # ['田中', '鈴木']この流れが実務の型
APIから受け取る、辞書に変換する、必要な部分まで [ ] で掘る、リストを内包表記やforで加工する。この一連の流れは、AIのAPIを使うときも他のWebサービスを使うときもほぼ同じです。ここを自分の手で追えることが目標でした。
AIにはこう聞く
「このJSONから18歳以上の名前だけをPythonで取り出すコードを書いて」と頼めばコードは出ます。あなたの役割は、u["age"] のキー名が実際のデータと合っているか、条件が >= 18 で正しいか(17歳が除外され18歳が含まれるか)を読んで確かめることです。境界の1歳のずれをAIが間違えることもあります。
読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。
理解度チェック
答えられれば、面接で説明できる状態に一歩近づきます。
nums = [1, 2, 3, 4] のとき、[n for n in nums if n % 2 == 0] の結果はどれですか。
users がユーザー辞書のリストのとき、各ユーザーの名前だけを集める内包表記はどれですか。
APIのJSONレスポンスから欲しい値を取り出す手順を、Day3で学んだ言葉を使って順に説明してください。
記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。