PyQオフィシャルブログ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

Pythonで obj[...][...] ってしてるのは何?

こんにちは。PyQ開発チームの清原 id:hirokiky です。

今日も PyQ のメールサポートで何度かいただいた質問の紹介をします。 複雑なところですが、こういった疑問を通して深いPythonスキルを鍛えていってもらえればと思います。

質問

14-8の演習問題 2問目で

detail[item_name]['count'] += 1

という記述があるのですがこれは何ですか?

回答

この問題は少し難しいですね。ご説明いたします。

これの前の問題では値の集計として total、count 変数の2つを使って合計と個数を数えました。 ご質問いただいた2問目では 商品ごとに 、totalとcountという2つの値を集計しています。

  • コーラ: 320円、2個
  • コーヒー: 360円、3個

このように商品ごとに数を数えるため、detail という辞書を使っています。 detail は以下のような、 辞書の辞書 になります。

{ “コーラ”: {“total”: 320, “count”: 2}, “コーヒー”: {“total”: 360, “count”: 3} }

これは辞書の中に辞書を入れた値です。

if 文をもう一度見てみましょう。

if item_name in detail:
     detail[item_name]["total"] += data["price"]
     detail[item_name]["count"]+=1
else:
     detail[item_name]={"total":data["price"], "count":1}

if 内は、商品がすでに辞書 detail 内にある場合:

  • detail["コーラ"]["total"] += 160 のように値段を足す
  • detail["コーラ"]["count"] += 1 のように個数を1つ増やしている

detail["コーラ"] で内側の {"total": 320, "count": 1} の辞書を取り出しています。 detail["コーラ"]["count"] で、内側の辞書の 21 を追加しています。

else 内は、商品が辞書 detail 内に無い場合:

  • detail["コーラ"] = {"total": 160, "count": 1} のように初期化

商品の total, count を入れておく辞書(内側の辞書)を作っています。

他にもよく使う構造

この 辞書の辞書 はよく使われます。

他には例えば {ID値: {情報}} のような値です。 CSVやデータベースから取り出した値を、ID値で取り出しやすくした形です。

users = {
    1: {"name": "hirokiky", "birthday": date(1991, 11, 5)},
    2: {"name": "haruo860"...},
}

この場合 users[1]["name"] が「IDが1のユーザーの名前」ということになります。

あとは、「辞書のリスト」もよく使われます。 上記と似た例ですが、データベースやCSVから取り出したときの値でよくあります。

[
    {"id": 1, "name": "hirokiky", "birthday": date(1991, 11, 5)},
    {"id": 2, "name": "haruo860"...},
]

この場合、各行(内側の辞書)の順序は保持されますが、ID値でユーザー情報をすぐ取り出すようなことはできません。

いかがでしょうか?

辞書の辞書というところがポイントになります。 難しいところですが、辞書やリストのより複雑な使い方を身に付ければどんな値でもうまく扱えるようになります。

良い値、データの表し方、扱い方ができていればプログラムの処理自体はとても簡単に、簡潔に書けるようになります。 ぜひPyQでそのような深い技術も身に着けていってください。

pyq.jp