結論: 辞書(dict)型は、キー(名前)と値のペアで、データを管理する入れ物です。リストは「番号」で取り出し、辞書は「キー」で取り出します。存在しないキーを取り出すとKeyErrorになるため、**get()**を使うと安全です。JSONやAPIの応答と形が近く、データを扱う場面で、よく使います。
辞書とは
1人の情報を、リストで管理すると、こうなります。
person = ["田中", 30, "東京"]
「30」が年齢だと、番号(1番目)から推測する必要があります。辞書なら、名前をつけて管理できます。
person = {"name": "田中", "age": 30, "city": "東京"}
{ }の中に、「キー: 値」を、カンマで区切って並べる- 値の取り出しは、キーを使う
変数の基本は、変数とはをご覧ください。
リストとの違い
| リスト | 辞書 | |
|---|---|---|
| 取り出し方 | 番号(fruits[1]) |
キー(person["age"]) |
| 向くデータ | 順番が大事な、同じ種類のデータ | 名前をつけて、項目ごとに管理するデータ |
| 例 | 商品名の一覧 | 1人分の氏名・年齢・住所 |
リストの基本は、配列(リスト)とはで解説しています。
基本の操作
① 取り出す
person = {"name": "田中", "age": 30}
print(person["name"]) # 田中
② 安全に取り出す:get()
存在しないキーを取り出すと、エラーになります。
print(person["email"])
# KeyError: 'email'
get() を使うと、エラーにならず、キーがなければ、既定の値を返します。
print(person.get("email", "なし")) # なし
③ 追加・更新
person["email"] = "tanaka@example.com" # なければ追加
person["age"] = 31 # あれば更新
追加も更新も、同じ書き方です。キーがなければ追加、あれば値が上書きされます。
④ キーがあるか確認する
if "email" in person:
print("あります")
⑤ 削除する
del person["city"] # 削除(なければ KeyError)
person.pop("age") # 取り出して削除
全部を順に処理する
for key, value in person.items():
print(key, value)
items()で、キーと値のペアを、順に取り出す- キーだけなら、
for key in person: - 値だけなら、
for value in person.values():
繰り返しの基本は、ループ(繰り返し)とはをご覧ください。
キーに使える値
| 使える | 使えない |
|---|---|
文字列("name") |
リスト(あとから中身を変えられる) |
数値(1) |
辞書 |
| タプル |
- 同じキーは、1つしか持てない。同じキーに代入すると、値が上書きされる
- 値には、何でも入れられる(リストや、別の辞書も)
辞書の中に辞書:入れ子
users = {
"tanaka": {"age": 30, "city": "東京"},
"sato": {"age": 25, "city": "大阪"},
}
print(users["tanaka"]["city"]) # 東京
JSONや、APIの応答は、このような入れ子の形をしています。階層のあるデータを、すべて調べる時は、再帰が使えることもあります。
よくあるつまずき
| 症状 | 原因 | 対処 |
|---|---|---|
| KeyError | 存在しないキーを取り出した | キーの綴りを確認。get() を使う |
| 値が上書きされた | 同じキーに、もう一度代入した | キーが重複していないか確認する |
| 文字列と数値で一致しない | "1" と 1 は、別のキー |
キーの型をそろえる |
| 変更されてしまう | 辞書をコピーせずに、別の変数に代入した | copy() で、コピーを作る |
エラーの扱い方は、例外処理とはも参考にしてください。
まとめ
- 辞書は、キーと値のペアで、データを管理する入れ物
- リストは番号、辞書はキーで取り出す
- 存在しないキーはKeyError。get() で、エラーを防げる
- 追加と更新は、同じ書き方。全部を処理する時は、
items() - JSONやAPIの応答と形が近く、入れ子にもできる
関連記事:配列(リスト)とは、JSONとは、変数とは、ループ(繰り返し)とは、例外処理とは