【Python】辞書にキーが存在しない時だけ値を登録する方法(setdefault、not in演算子)

Python 組込み型 組込み関数 辞書型

辞書にデータ(key, valueペア)を登録する際、キー(key)が既に存在している場合は値(value)は上書きされます。
しかし、値(value)が上書きされたら困る場合もあり、このような時はキーが存在しないときだけ値を登録するよう工夫が必要になります。
今回は、このような場合に役に立つ方法として、

  • if not in〜 でキーの存在を事前に確認する方法
  • setdefault()を使う方法

について解説します。
また最後に応用例として、英文字列中に出現するアルファベットの出現回数をカウントするコード例も示しました。

if not in 〜でキーの存在を事前に確認する

not in演算子(またはnot in演算子)を使ってKeyが辞書に存在するかを確認する方法です。

下記の例は、「辞書dのキーに’x’が存在しない場合に{‘x’ : 99}を追加する」場合のコード例です。

# 元の辞書d
>>> d = {'a' : 1, 'b' : 2, 'c' : 3}

# 辞書dのキーに'x'が存在しない場合に{'x' : 99}を登録
>>> if 'x' not in d.keys():
...     d['x'] = 99
... 

# 確認結果。要素{'x' : 99}が追加されています。
>>> d
{'a': 1, 'b': 2, 'c': 3, 'x': 99}

また、辞書の要素をチェックする際のTipsも挙げておきます。

  • Keyのチェックはdict.keys()の代わりにdictだけでも使えます。(★部)
  • >>> d = {'a' : 1, 'b' : 2, 'c' : 3}
    
            >>> if 'x' not in d: ★
            ...     d['x'] = 99
            ... 
            >>> d
            {'a': 1, 'b': 2, 'c': 3, 'x': 99}
  • 値(value)が辞書に存在するかどうかをチェックすることもできます。
    dict.values()を使うと、値(value)が辞書に存在するかどうかを確認できます。
  • >>> d = {'a' : 1, 'b' : 2, 'c' : 3}
        >>> 3 in d.values()
        True

参考記事1)【Python】 in 演算子 /not in 演算子の使いかた
参考記事2)【Python】 辞書(dict)の要素の追加、連結および削除

setdefault()を使う方法

前章で述べた動作は、組み込み関数setdefault() を使うと1行で書くことが出来ます。

この関数の動作は下記の通りで、

  • Keyが辞書に存在しない場合: 値(value)を辞書に登録し、defaultを返す
  • Keyが存在した場合: 現状の辞書に登録されている値(value)を返す

また、前述したように組込み関数なので新たにimportも必要ありません。
使い方は下記の通りです。

setdefault(key[, default])

引数はそれぞれ次の通りです。

key 登録したいキー
default そのキーが辞書に存在しない場合に辞書に登録する値
(初期値は None)

具体的なコード例で挙動を確認してみます。

  • キーが存在しない場合
  • >>> d = {'a' : 1, 'b' : 2, 'c' : 3}
    
    # キー'x'が存在しないので、defaule:99が返されます
    >>> d.setdefault('x', 99)
    99
    
    # 要素{'x' : 99}が追加されました
    >>> d
    {'a': 1, 'b': 2, 'c': 3, 'x': 99}
  • キーが存在する場合
  • >>> d = {'a' : 1, 'b' : 2, 'c' : 3}
    
    # キー'a'が存在したので、現状のキー'a'の値:1が返されます
    >>> d.setdefault('a', 99)
    1
    
    # 要素は追(更新)されていません
    >>> d
    {'a': 1, 'b': 2, 'c': 3}

応用例(文字の出現回数をカウントする)

応用例として、文字列中の文字の出現回数をカウントするコードを以下に示します。(コードはこちら

def charcounter(l):
    count_ ={}
    for s in l:
        count_.setdefault(s, 0) # 辞書countにキー sが無い場合は0を登録
        count_[s] += 1 # 文字数カウント +1する
    return count_
    
message = 'This dog helped him watch the sheep.'
count = charcounter(message)
print(count)

#実行結果
{'T': 1, 'h': 6, 'i': 2, 's': 2, ' ': 6, 'd': 2, 'o': 1, 'g': 1, 'e': 5, 'l': 1, 'p': 2, 'm': 1, 'w': 1, 'a': 1, 't': 2, 'c': 1, '.': 1}

確認した環境

  • OS: Ubuntu18.04LTS
  • Python3.8.4

まとめ

辞書にキーが存在しない場合のみデータ(key, valueペア)を登録するには、下記2つの方法が挙げられます。

  • if not in 〜 を使って辞書にキーが存在するかどうかを確認してから辞書に登録する
  • 組込み関数setdefault()メソッドを使う

後者のsetdefault()を使う方法は一行に記述できるので、コードの簡略化に有効と思います。
また、具体例として文字列に出現する文字の回数をカウントする例を挙げましたが、文章における単語の出現頻度を調べるなどの応用例にも使えると思います。

参考書籍

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

シェアする
ひびきをフォローする
Hbk project