[Python] 辞書に存在しないキーを登録する(setdefault)

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

辞書にデータ(key, valueペア)を登録する際に、

キーが辞書に存在しないデータのみ登録したい!

こういう場面があると思います。
今回はこんな時に役に立つ「キーが辞書に存在しないデータのみを登録する方法」として、

  • not in演算子を使ったキーの存在を確認する方法、および
  • 組み込み関数setdefault()を使う方法

についてまとめます。
# 2019/5/1 記事更新

確認した環境

  • OS: Ubuntu 16.04LTS
  • Python3.7.2@Anaconda

辞書にデータ(key, valueペア)を登録する

辞書にデータ(key, valueペア)を登録するには、単純に

>>> dict = {'a':3, 'b':2, 'c':1}

>>> dict['f'] = 10
>>> dict
{'a': 3, 'b': 2, 'c': 1, 'f': 10}

とすれば登録できますが、キーが辞書に存在した場合は下記のように値(value)が上書きされてしまいます。

>>> dict = {'a':3, 'b':2, 'c':1}

>>> dict['a'] = 10
>>> dict
{'a': 10, 'b': 2, 'c': 1}

よって、辞書に新しいデータを追加する場合は、最初にキーが存在するかどうかを確認する必要があります。

辞書にキーが存在しているかどうかを確認する

in演算子/not in演算子を使うと確認できます。

>>> dict = {'a':3, 'b':2, 'c':1}

# キーが辞書に存在する場合
>>> 'a' in dict
True

>>> 'a' not in dict
False

# キーが辞書に存在しない場合
>>> 'f' in dict
False

>>> 'f' not in dict
True

dict.keys()を使っても同様の結果が得られます。

# キーが辞書に存在する場合
>>> 'a' in dict.keys()
True

>>> 'a' not in dict.keys()
False

# キーが辞書に存在しない場合
>>> 'f' in dict.keys()
False

>>> 'f' not in dict.keys()
True

<参考>値(value)が辞書に存在するかどうかを確認する

dict.values()を使うと、値(value)が辞書に存在するかどうかを確認できます。

>>> 3 in dict.values()
True
>>> 10 in dict.values()
False

not in演算子を使った辞書の登録

辞書に存在しないキーのデータ(key, valueペア)を登録するには、前項で示したnot in演算子を使って以下のように書けます。

# キーが存在しない場合
>>> dict = {'a':3, 'b':2, 'c':1}

>>> if 'f' not in dict:
...     dict['f'] = 10
... 

>>> dict
{'a': 3, 'b': 2, 'c': 1, 'f': 10}

# キーが存在する場合場合
>>> dict = {'a':3, 'b':2, 'c':1}

>>> if 'a' not in dict:
...     dict['a'] = 10
... 

>>> dict
{'a': 3, 'b': 2, 'c': 1}

これと同じ動作は、setdefault()関数を使うともっと簡単に書けます。

setdefault()を使った方法

setdefault()メソッドはPythonの標準の組込み関数なので、新たにライブラリをimportする必要はありません。使い方を以下に示します。

setdefault(key[, default])

引数は以下の2つをとります。

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

もしkey が辞書に存在していれば、その辞書に登録されている値を返します。
keyが存在しなければ、key:defaultのペアを辞書に登録し、default を返します。

>>> dict = {'a':3, 'b':2, 'c':1}

#キーが存在する場合
>>> dict.setdefault('a')
3

#キーが存在しない場合
>>> dict.setdefault('f', 10)
10
>>> dict
{'a': 3, 'b': 2, 'c': 1, 'f': 10}

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

setdefaulet()メソッドは、キーが確実に存在するようにするための便利なメソッドです。応用例として、文字列中の文字の出現回数をカウントするコードを以下に示します。(コードはこちら

def charcounter(l):
    count_ ={}
    for s in l:
        count_.setdefault(s, 0)
        count_[s] += 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}

まとめ

辞書に存在しないキーのデータ(key, valueペア)を登録する方法についてまとめました。

  • not in演算子を使う
  • setdefault()メソッドを使う

Learn more...

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

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