データ構造 – リストと辞書 –
はじめに
現在のPythonの仕事で、API送信されたデータをベースモデルを介して受信し、リストとして保持して、目的の形に変換した上で、レスポンスを作成して返すというのをやっている。
レスポンスに必要なデータをそれぞれリストとして保持して、レスポンスを作成しているが、辞書として保持した方が、柔軟性が高いのではないかと思う。
現実問題として、リストとして保持しているせいで、複数の送信APIに対応できていない。
以下のようなAPIが送られてきた時に、
{
{id : 1
name: a
},
{id : 2
name: b
}
}
idとnameをそれぞれリストとして保持しているのが今の設計。
id_list = [1, 2]
name_list = [a, b]
これをfor文で取り出して処理を行っている。
for id in id_list:
print(id)
for name in name_list:
print(name)
でも、nameにid情報を付与したいという場面で困る。
*、**といったアンパックを行おうとしたが、目的の形にならなかった。
だから、辞書のデータ構造に切り替えた方がいいのではないかと感じた。
リストと辞書、それぞれの使い所を整理しておきたい。
ChatGPT 5の回答
今の状況だと、まさに**「リストか辞書か」問題**の典型例ですね。
整理すると、今の設計は「idとnameを別々のリストに保持」しているために、関連するデータ同士の結びつきが壊れてしまっているのが根本の課題です。
1. リストと辞書の基本的な使い所
データ構造 | 向いている場面 | 特徴 |
---|---|---|
リスト ([] ) | 順序が重要・要素が一列に並ぶデータ | インデックスアクセス(list[0] )、順番の保持、同じ型のデータ集合に向く |
辞書 ({} ) | 要素同士を「キーと値」で関連付けたい場面 | キー検索が高速(O(1))、順序も保持(Python3.7+)、異なる型のデータも一緒に格納できる |
2. 現状の問題点
現状:
id_list = [1, 2]
name_list = ['a', 'b']
この構造だと、
- idとnameの対応関係が暗黙的(同じインデックスという前提)
- APIが増えると対応関係が複雑になり、インデックスずれやバグの温床になる
for
で回すときに関連情報をまとめて扱いにくい
3. 改善案 – 「辞書のリスト」にする
APIの1レコードを辞書として表現し、それをリストでまとめる構造です。
data_list = [
{"id": 1, "name": "a"},
{"id": 2, "name": "b"}
]
処理例:
for item in data_list:
print(item["id"], item["name"])
これなら
- 1つの要素(辞書)に
id
とname
の関連性を保持 - API仕様変更で項目が増えても柔軟に対応可能(
age
,address
など追加可) - 複数の送信APIのデータを同じ形に揃えて扱いやすい
4. 別パターン – 「辞書の辞書」
もしid
がユニークで、直接id
から情報を引けるほうが便利なら、キーをid
にする方法もあります。
data_dict = {
1: {"name": "a"},
2: {"name": "b"}
}
アクセス:
print(data_dict[1]["name"])
メリット:
id
がキーなので検索が速い- 特定
id
のデータ更新が簡単
デメリット:
- データを順番に処理したいときは
.items()
や.values()
を使う必要あり
5. 実務での指針
- リストを使うべき時
- 順序が重要(例: タスクの処理順)
- 単一の型で同質なデータを並べるだけで十分
- 辞書を使うべき時
- 複数の属性を1つの「レコード」として保持したい
- データをキーで高速に取り出したい
- APIの仕様変更や項目追加に柔軟に対応したい
6. 今回の結論
今回のAPIレスポンス保持は**「辞書のリスト」構造が最適。
さらにid
をキーにした「辞書の辞書」**も、検索頻度が高い場合に有効。
もし希望があれば、
**「リスト構造から辞書構造に変換する関数」**もサンプルコード付きで作れます。
これを使えば、既存のid_list
とname_list
から一瞬で移行できます。
自分の結論
リストとしてとりあえず、API受信→データ変換→APIレスポンス送信を行っていたが、辞書に変えよう。
お盆休み明けの8/18(月)から対応していく。
現職で成功体験を得ることが今後のキャリアにつながるミチシルベになる。
そのために困難を分割してスモールステップで進んでいき成功体験を得て自信を雪だるま式に積み上げていこう。
pile upしていこう。
コメントを残す