複数の値の出力はリストより辞書がいい

はじめに

前回のソースコード版をやっていこう。

リストの場合、zipで頑張る必要あり

# === Before ===
id_list = [1, 2]
name_list = ["a", "b"]

# idだけ処理
for id_val in id_list:
    print(f"id: {id_val}")

# nameだけ処理
for name_val in name_list:
    print(f"name: {name_val}")

# idとnameを一緒に使いたいとき(zipで頑張る必要あり)
for id_val, name_val in zip(id_list, name_list):
    print(f"id: {id_val}, name: {name_val}")

出力結果

id: 1
id: 2
name: a
name: b
id: 1, name: a
id: 2, name: b

idとnameを一緒に使いたい時は、zipで頑張る必要あり。

実際に昨日の自分も頑張っていた。

いや、zipを使いこなせていなかった。

zipを使えば、やりたいことができたかもしれない。

総ての過去を未来に繋げていこう。

スキル不足を認識できてよかった。

無意識的無能から意識的無能へのジャンプに成功した。

辞書の場合、まとめて出力できる

# === After ===
data_list = [
    {"id": 1, "name": "a"},
    {"id": 2, "name": "b"}
]

# idとnameをまとめて処理
for item in data_list:
    print(f"id: {item['id']}, name: {item['name']}")

# nameだけ取り出す
for item in data_list:
    print(item["name"])

# idをキーに高速アクセスしたい場合は辞書の辞書も可
data_dict = {item["id"]: {"name": item["name"]} for item in data_list}
print(data_dict[1]["name"])  # → "a"

出力結果

id: 1, name: a
id: 2, name: b
a
b
a

data_dictがどうなっているか?

こうなっていた。

data_dict
{1: {'name': 'a'}, 2: {'name': 'b'}}

これはありがたい。

これできるんだ!

リスト → 辞書の変換

id_list = [1, 2]
name_list = ["a", "b"]

data_list = [{"id": id_val, "name": name_val} for id_val, name_val in zip(id_list, name_list)]
print(data_list)
# → [{'id': 1, 'name': 'a'}, {'id': 2, 'name': 'b'}]

出力結果

[{'id': 1, 'name': 'a'}, {'id': 2, 'name': 'b'}]

この変換は、必要があれば行おう。

現状は、リストに直さずに、API送信されたデータをそのまま辞書に変換すればいいはず。

→ Pydantic v2のmodel_dump関数で変換した。

data = model_instance.model_dump()

ベースモデルを介した後のデータ型が辞書かもしれない。

いや、それは、ベースモデルを継承したクラスのデータ型になっている。

そのデータ構造をそのまま利用すればよかったかもしれない。

余計なことをしてしまった。

シンプルに考えよう。

シンプルに考えるのが一番難しい。

突き詰めて考えるとシンプルになるというパラドックスがある。

PydanticのBaseModel

Pythonのデータバリデーションと設定管理を行うためのライブラリ。

FastAPIなどのWebフレームワークでよく使われている。

使用例

from pydantic import BaseModel

class User(BaseModel):
    id: int
    name: str
    email: str

# 正しいデータ
user = User(id=1, name="Hiroki", email="test@example.com")
print(user)

# 自動変換
user = User(id="2", name="Taro", email="taro@example.com")
print(user.id)  # int型の2になる

# 間違ったデータ
User(id="abc", name="Yuki", email="yuki@example.com")
# => ValidationError: id が整数ではない

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です