[第1回]初心者のPythonつまずき日記~辞書(dict)編~
単体で見ると怖くない辞書(dict)
Pythonの勉強を始めて10日目、これまで順調だった私もついに初めての「つまずきポイント」にぶつかりました。それが「辞書(dict)」です。
辞書(dict)は一見とてもシンプルです。
中身は、波かっこ {} で囲まれた キー(key)とバリュー(value) のペアで構成され、コロン : を使って両者を結びます。実際に最小構文で書くと、以下のようになります。
dictionary = { 'key': 'value' }
この構造だけを見ると、「なんだ簡単じゃん」と思ってしまいます。
私もそう思い込んでいたせいで、結果として ChatGPT 相手に30分間もディスカッションする羽目になりました。
さりげなく挟まれるとやっかいな辞書
辞書で混乱したきっかけは、学習中の教材で以下のようなコードと出会ったことでした。
content_ratings = {}
ratings = ['4+', '4+', '4+', '9+', '9+', '12+', '17+']
for c_rating in ratings:
if c_rating in content_ratings:
content_ratings[c_rating] += 1
else:
content_ratings[c_rating] = 1
print(content_ratings)
ちなみにこのコードの出力は以下の通りです:
{'4+': 3, '9+': 2, '12+': 1, '17+': 1}
つまり、ratings の中にある各アプリの対象年齢の文字列の出現回数がカウントされているというわけです。
これはとある実践問題に取り掛かる前に提示された例文で、辞書の中身が不明な時に使える、特定のkeyに対応するvalueを取り出してその数をカウントする処理を説明するためのものです。このコードでは、まず空の辞書 content_ratings が定義されています。
一見すると単純な構造に見えますが、初心者が見落としやすい“落とし穴”がありました。
それは、forループで使われている変数 c_rating と、if/elseブロックで使われている content_ratings[c_rating]のc_rating の中身の認識の違いでした。
なぜ混乱したのか?
forループの c_rating には、ratings リスト内の文字列(たとえば '4+')が1つずつ順番に代入されていきます。
つまり、c_rating は「文字列」であり、リストの中の要素です。
しかし、その c_rating が content_ratings[c_rating] のように辞書アクセスに使われると、話がややこしく感じました。
私は当初、content_ratings の構造を {key: value} だと覚えていたので、c_rating は 'key' にあたると認識しました。
ここまでは合っています。
でも次に、content_ratings[c_rating] += 1 のような処理を見て、
「え、文字列 '4+' に +1 しようとしてる? それってシンタックスエラーになるんじゃ?」
と誤解してしまったのです。
原因の正体
辞書の基本構造では、key を指定すると、それに紐づく value を取得・更新できます。
つまり、content_ratings[c_rating] は、
「c_rating をkeyとして、value を取り出す(or 書き換える)」
という処理をしているわけです。
このとき、加算されているのは文字列 '4+' ではなく、そのkeyに対応する valueです。
つまり、誤解の原因は「辞書の構文理解が中途半端だったこと」と、「キーと値を混同していたこと」でした。
気づきと学び
このコードの構造を正しく理解するには:
-
ratingsリストから取り出された文字列(c_rating)が、辞書のkeyとして使われている - その
keyに対応するvalue(=そのkeyが出現した回数)をカウントしている -
ifで「そのkeyがすでに辞書に存在するか」を判定し、あればそのkeyに対応する値に加算、else処理で「存在しない」判定なら初期値1を代入している
という流れを押さえる必要がありました。
結論
辞書(dict)という構造自体は単純ですが、他の構文と組み合わさると一気に難しく感じることがあると学びました。今回は、forループ・if文・辞書アクセスという3つの要素が同時に登場し、「c_ratingとは何なのか?」という視点がぶれたことで混乱が起きました。でもこの経験を通して、「辞書はkeyを通じてvalueにアクセスする」という本質をしっかりと体に刻むことができました。これらの処理は、pandasでならより実践的かつ効率的に行えると思うので、早く基礎学習フェーズを抜けて扱えるようになりたいです。
Discussion