【Python】 辞書(dict)の要素の追加、連結および削除

Pythonの辞書(dict型)について、

  • 要素(key, valueペア)を追加
  • 別の辞書を連結
  • 任意の要素(key, valueペア)を削除

の方法についてまとめます。
キー(key)が既に存在するかどうかで挙動が変わってくるので注意が必要です。
# 2020/1/27 記事更新

確認した環境

  • OS: Ubuntu 16.04LTS
  • Python3.7.4

辞書に要素を追加する(dic[key]=value、setdefault)

追加したい要素のキー(key)が辞書に無い場合は、下記で追加できます。

dic[key] = value

具体的例で見てみます。

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

# 新しい要素('f', 10)を追加する
>>> dict['f'] = 10

# 新しい要素が追加されています。
>>> dict
{'a': 3, 'b': 2, 'c': 1, 'f': 10}

尚、追加したい要素のキー(key)が辞書に存在している場合は、新しい値(value)に置き換えられます。

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

# 新しい要素('a', 20)を追加する
>>> dict['a'] = 20

# key: 'a'が既存なので、値が書き換えられています
>>> dict
{'a': 20, 'b': 2, 'c': 1}

要素を置き換えたくない場合は、setdefault()関数を使って辞書に存在しないキーの要素のみを追加することも出来ます。

setdefault()についてはこちらの記事でまとめています。
[Python] 辞書に存在しないキーを登録する(setdefault)

辞書データの連結(dic.update)

辞書同士を連結するには、下記のようにupdate() を使います。

dic.update([other])

ある辞書dicに、別の辞書otherを連結します。返り値はNoneです。
例を以下に示します。

>>> dic000 = {'a':1, 'b':2, 'c':3}
>>> dic001 = {'x':91, 'y':92, 'z':93}

# dic000に、dic001を連結
>>> dic000.update(dic001)
>>> dic000
{'a': 1, 'b': 2, 'c': 3, 'x': 91, 'y': 92, 'z': 93}

既にkeyが存在している要素はvalueが上書きされます。

>>> dic000 = {'a':1, 'b':2, 'c':3}
>>> dic002 = {'c':55, 'y':92, 'z':93}

# 'c'が存在しているので、新しいvalue(この場合は55)が上書きされます
>>> dic000.update(dic002)
>>> dic000
{'a': 1, 'b': 2, 'c': 55, 'y': 92, 'z': 93}

尚、otherは、辞書の他にキーワード引数key:valueペアを表したイテラブル(リスト、タプルなど)も設定できます。

・キーワード引数を設定

>>> dic000 = {'a':1, 'b':2, 'c':3}
>>> dic000.update(x=91, y=92, z=93)
>>> dic000
{'a': 1, 'b': 2, 'c': 3, 'x': 91, 'y': 92, 'z': 93}

・key, valueのタプルのリストを設定

>>> dic000 = {'a':1, 'b':2, 'c':3}
>>> dic000.update([('x', 91), ('y', 92), ('z', 93)])
>>> dic000
{'a': 1, 'b': 2, 'c': 3, 'x': 91, 'y': 92, 'z': 93}

・key, valueのタプルのタプルを設定

>>> dic000 = {'a':1, 'b':2, 'c':3}
>>> dic000.update((('x', 91), ('y', 92), ('z', 93)))
>>> dic000
{'a': 1, 'b': 2, 'c': 3, 'x': 91, 'y': 92, 'z': 93}

辞書の要素を削除

pop()による削除

pip(key, [default]) は、指定したキー(key)が辞書に存在すればその要素を辞書から削除します。

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

#辞書にkeyが存在する場合
>>> dic.pop('a')
1
>>> dic
{'b': 2, 'c': 3}

キー(key)が存在しなければ、pop()の第二引数で設定したdefaultを返します。

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

#辞書にkeyが存在しない場合
>>> dic.pop('e', 'no key')
'no key'

キー(key)が存在せず、且つdefaultも設定されていない場合はKeyErrorを返します。

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

#辞書にkeyが存在せず、且つdefaultも設定されていない場合、KeyErrorが発生
>>> dic.pop('e')
Traceback (most recent call last):
File "", line 1, in 
KeyError: 'e'

delによる削除

リストと同様に、del文を使って項目を削除することも出来ます。

del d[key]

例を以下に示します。

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

#keyが辞書に存在する場合
>>> del dic['a']
>>> dic
{'b': 2, 'c': 3}

辞書にキー(key)が存在しない場合はKeyErrorが返されます。

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

# keyが辞書に存在しない場合はKeyErrorを返します
>>> del dic['e'] 
Traceback (most recent call last):
File "", line 1, in 
KeyError: 'e'

popitem()による削除

popitem() は、任意のkey:valueペアをLIFO(後入れ先出し)の順番で辞書から消去して返します。辞書が空の場合はKeyErrorを返します。
(※)Python3.7より辞書の順序が保証されるようになりました。
尚、削除される項目はランダムに選択されると記載されているサイトもありますが、挙動を見る限り、辞書データをスタック(LIFO:後入れ先出し方式)として扱い、popitem()メソッドにてデータ読み出し(POP)しているように見えます。辞書データはPython3.6時点では挿入順番を保証していないことから、ランダムに見えるのだと思います。

>>> dic = {'b':2, 'a':1, 'c':3}
>>> dic.popitem()  #辞書データを順次読み出し
('c', 3)
>>> dic.popitem()
('b', 2)
>>> dic.popitem()
('a', 1)
>>> dic.popitem()  #辞書が空になるとエラー発生
Traceback (most recent call last):
File "", line 1, in 
KeyError: 'popitem(): dictionary is empty'
>>> dic
{}

#辞書の順番を変えてみます
>>> dic = {'b':2, 'c':3, 'a':1}
>>> dic.popitem() #最後のデータから順番に読み出し
('a', 1)
>>> dic.popitem()
('c', 3)
>>> dic.popitem()
('b', 2)
>>> dic.popitem()
Traceback (most recent call last):
File "", line 1, in 
KeyError: 'popitem(): dictionary is empty'
>>> dic
{}

LIFO(スタック)についてはこちらの記事でまとめています。
<アルゴリズムの基本②> データ構造(スタックとキュー)について

clear()による全データ削除

clear() は、辞書の全ての項目を消去します。

>>> dic = {'b':2, 'c':3, 'a':1}
>>> dic.clear()
>>> dic
{}

まとめ

辞書データの追加、連結そして削除についてまとめました。

  • 追加: 辞書に対し新たなkeyとvalueを指定(dic[key] = value)
  • 連結: dic.update(other)
  • 削除: pop()メソッド、 del文、popitem()、clear()

Learn more...

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