リストではよくあるin演算子を使った要素の存在確認。辞書でもキーの存在確認とその値を取得するときにも同じことをしていませんか? もっとシンプルでよい方法があるんです。
以下はif文を使って辞書dataに'b'というキーがあるかどうかを調べて、あれば変数valueの値をキー'b'の値にし、なければ0にするというコードだ。しかし、このコードはif文を使わずにもっと簡潔に記述できる。修正後のコードはどんなものになるだろうか。なお 、if条件式(三項演算子)を使わない方法で考えること。
data = {'a': 1, 'b': 2, 'c': 3}
if 'b' in data:
value = data['b']
else:
value = 0
どうもHPかわさきです。
リストでは当たり前に、問題文のようなコードを書きますよね。Pythonといえば、リスト。リストで要素の存在確認といったらin演算子。使い慣れたイディオムなので、辞書を使っていても、ついつい同じようにin演算子を使ってしまいがちです。でも in演算子でイーンでしょうか?(なんちゃって)──いいえ、もっと短くスッキリ書ける方法があるんです。知っていますか?
「イーンでしょうか?」と書いて思い出しました。(2025年3月時点の話ですが)サッカー日本代表に関わる皆さま、ワールドカップ出場権獲得おめでとうございます!(どうでもいい?)
修正後のコードの例を以下に示します。
data = {'a': 1, 'b': 2, 'c': 3}
value = data.get('b', 0)
辞書はキー/値の組を格納するデータ構造です。例えば、辞書dataがあったとしましょう。dataに'key'というキーを保持していたとすると、その値は「data['key']」のようにしてアクセスできます(読み取りも書き込みも)。しかし、存在していないキーの値を読み取ろうとするとKeyError例外が発生します。
data = {'a': 1, 'b': 2, 'c': 3}
value = data['d'] # KeyError
そのため、問題文でやっているような「あるキーの値を読み取って、その値を変数に代入する」ような処理をするには、例外が発生しないようにif文でキーが存在するかどうかを確認したり、例外に対処するようなコードを書いたりする必要がありそうに思えます。このうち、if文を使ったコード例が問題文に挙げたものです。
data = {'a': 1, 'b': 2, 'c': 3}
if 'b' in data:
value = data['b']
else:
value = 0
例外が発生したときに対処するなら次のようなコードが考えられます。
data = {'a': 1, 'b': 2, 'c': 3}
try:
value = data['b']
except KeyError:
value = 0
この「辞書にキーがあるかどうかを確認して、あればその変数の値を取得し、なければ何らかの値を使用する」というのはよくある処理なので、これをカンタンに行えるメソッドが用意されています。それが辞書のgetメソッドです。このメソッドでは第1引数に存在確認したいキーを、第2引数にキーがなかったときに返される値を指定します。第2引数を指定しなかった場合にはNone値が指定されたものとして解釈されます。
getメソッドを使うと、上のコードは次のように書き直せます。if文や例外処理を含んだコードと見比べると、コードがとてもシンプルになっていることが分かりますね。
data = {'a': 1, 'b': 2, 'c': 3}
value = data.get('b', 0)
問題文では、辞書にキー'b'がなければ、変数valueには0を代入していました。そのため、getメソッドの第2引数には0を指定しています。
エラそうなことを書いてはみたものの、多分、筆者は問題文のようなコードを山ほど書いてきました。これはみんなが通る道なんですよね。知っているからエラいというわけではないことは心に留めておく必要があるなぁ。世には「ニワカ笑うな、来た道だ。古参嫌うな、行く道だ」という言葉もあるように、初心者から上級者に至るまで、みんなをリスペクトしたいものです。
辞書については「Python入門」の「辞書」でその概要を取り上げています。興味がある方はそちらも読んでくれるとうれしいです。
初心者向け、データ分析・AI・機械学習・Pythonの勉強方法 @ITのDeep Insiderで学ぼう
Copyright© Digital Advantage Corp. All Rights Reserved.
Deep Insider 記事ランキング