重複を許す整数の配列があるような状況を想定する。ここで、各整数が配列内に何回出現しているかを調べたい。このような問題設定の場合はhashmapを使うことで要素をカウントすることができる。
dictを使用した方法
pythonのオリジナルのclassのdictだけを使用して行う。
一番シンプルな方法
keyが存在しないのに、そのkeyの使用を行おうとした場合エラーを出すのでkeyの存在を確認するという場合分けを行う。
d = {}
for num in nums:
if num in d:
d[num] += 1
else:
d[num] = 1
getを使った方法
初見ではトリッキーではあるが、このようなコードも見かける。dictのget(key, default=None)
はあるkeyに対応するvalueを返す、keyが存在しない場合はdefaultの値を返すという挙動をする。
d[key]による要素の取得では、keyが存在しない場合にエラーが出てしまうがgetはエラーを発生させずに処理を行える。
d = {}
for num in nums:
d[num] = d.get(num, 0) + 1
defaultdictを使う
pythonのcollectionsに含まれているdefaultdictを使用することでも場合分けを避けることができる。keyを自身で定義していない場合でもエラーが発生せず、デフォルト値が返される。
import collections
d = collections.defaultdict(int)
for num in nums:
d[num] += 1
Counterを使う
collectionsに含まれるのCounterを使用することも可能。numsのような(イテラブルなど)を渡せば、自動的にこれまでやってきたような処理を行ってくれる。コードを見ればわかるように引数にnumsを指定するだけで、要素をkey、カウント数をvalueとするようなdictが作られる。
文字列やdictを渡すことも可能である。
import collections
d = collections.Counter(nums)