連載
» 2019年06月19日 05時00分 公開

Python入門:[Python入門]辞書 (3/4)

[かわさきしんじ,DeepInsider編集部]

辞書の操作

 辞書からの項目の削除、全項目の削除、特定のキーの存在確認といった、辞書の操作はリストの操作と同様に行える。これらについては簡単にまとめておこう(以下の表の例では変数mydictに「{'foo': 'foo', 'bar': 'bar', 'baz': 'baz'}」という辞書が格納されているものとする)。

操作 方法
辞書の項目数を取得する len(辞書) len(mydict)→3
辞書の項目を削除する del 辞書[キー] del mydict['foo']
指定したキーkeyが辞書に含まれているか key in 辞書 'hoge' in mydict→False
指定したキーkeyが辞書に含まれていないか key not in 辞書 'hoge' not in mydict→True
辞書の全項目を削除する 辞書.clear() mydict.clear()
辞書をコピーする 辞書.copy() newdict = mydict.copy()
辞書の「浅いコピー」が行われる
辞書の操作

 注意する点としては、辞書を対象としてin演算子/not in演算子で存在確認を行う場合、指定した「キー」が辞書に含まれているかどうか(含まれていないかどうか)を調べるという点だ。辞書に特定の値が含まれているかどうかを知りたければ、後述するvaluesメソッドを使って、その戻り値に対してin演算子やnot in演算子を使用する。

 上の表には示さなかったが、sorted関数に辞書を渡すことも可能だ。ただし、その場合には「辞書のキーを並べ替えたリスト」が返される点にも注意が必要だ。辞書そのものを反復可能オブジェクトとして何らかの操作を行う場合、基本的にはそのキーが反復する要素となる。

 次に、辞書に特有の操作について簡単に見ていこう。

updateメソッドによる辞書の項目の変更

 updateメソッドは、辞書に存在する項目を変更したり、辞書にない項目を追加したりといった操作を行える。

updateメソッド

update([iterable][, **kwarg])


パラメーター 説明
iterable 辞書の内容の更新する値を含んだ反復可能オブジェクト(省略可能)。
iterableが辞書の場合は、辞書にその項目の内容が反映される(既存のキーについてはその値が変更され、新規のキーならその項目が追加される)。
他の反復可能オブジェクトについては、その要素が「2つの要素を持つ反復可能オブジェクト」である必要がある。その場合、最初の要素がキーに、次の要素がその値に見なされて、辞書の内容が更新される。
**kwarg 「キー=値」形式のキーワード引数を任意の数だけ指定できる。この場合、「キー」が辞書のキーとして、「値」がその値として使われて、辞書の内容が更新される
updateメソッドのパラメーター


 以下にupdateメソッドの使用例を示す。

mydict = {'foo': 'FOO', 'bar': 'BAR', 'baz': 'BAZ'}
print(mydict)  # 元の辞書
mydict.update(foo='fooo', somekey='somevalue'# キーワード引数による辞書の更新
print(mydict)
mydict.update({'bar': 'new BAR'})  # 辞書による辞書の更新
print(mydict)
mydict.update([('baz', 'new Baz'), ['x', 1]])  # リストによる辞書の更新
print(mydict)
mydict.update([('y', 2)], z=3# 両者の組み合わせ
print(mydict)

updateメソッドの使用例

 以下に実行例を示す。上のコードと照らし合わせながら、辞書の更新結果を確認してほしい。

実行結果 実行結果

popメソッドによる値の取得と削除

 popメソッドは、指定したキーに関連付けられている値を得ると共に、そのキーと値の組を辞書から削除する。

popメソッド

pop(key[, default])


 指定したkeyの値を取得し、その項目を辞書から削除する。指定したkeyが辞書にないときには、defaultに指定した値が返される。指定したkeyが辞書になく、defaultも指定していないときにはエラー(例外)が発生する。

パラメーター 説明
key その値を取得したいキー
default キーが辞書になかったときに返されるデフォルト値(省略可能)。省略した場合に、指定してkeyが辞書になければエラー(例外)が発生する
popメソッドのパラメーター


 popメソッドは、値の取得と削除を同時に行うのが、これまでに見てきた方法とは異なる点だ。以下に例を示す。

mydict = {'foo': 'foo', 'bar': 'bar', 'baz': 'baz'}
print(mydict)
result = mydict.pop('bar'# キー'bar'に対応する項目を削除
print(result)  # 削除した項目が戻り値になる
result = mydict.pop('bar', 'not found'# デフォルト値を指定
print(result)  # キー'bar'はないので、デフォルト値が戻り値になっている
result = mydict.pop('bar'# キー'bar'はもう存在しないのでエラー

popメソッドの使用例

 以下に実行結果を示す。デフォルト値を指定すると、キーが存在しない場合にはそれが戻り値となることと、デフォルト値を指定していないときには、キーが存在しなければエラーとなることに注目しよう。

実行結果 実行結果

popitemメソッドによる項目の取得と削除

 popitemメソッドは、辞書に登録されている項目の中から1つを削除して、そのキーと値の組(タプル)を戻り値とするものだ。

 以下に例を示す。

mydict = {'foo': 'foo', 'bar': 'bar', 'baz': 'baz'}
print(mydict.popitem())
print(mydict.popitem())
print(mydict.popitem())
print(mydict.popitem())

popitemメソッドの使用例

 Python 3.7で、辞書に追加された項目(キーと値の組)の追加順序が内部で保存されることが言語仕様であるとアナウンスされた。そして、Python 3.7以降では、popitemメソッドを呼び出すと、辞書に追加したのとは逆の順序(Last In First Out、LIFO:後入れ先出し)で項目が取り出されるようになっている。Python 3.6までのバージョンではこのように動作することは保証されていないので注意が必要だ(Python 3.6では実装詳細となっているが、公式な仕様とはなっていない)。

 以下は[Try Jupyter]ページから作成したJupyter Notebook環境のセルに上記コードを入力して、実行したところだ。辞書に追加した順序(キーでいえば「'foo'」→「'bar'」→「'baz'」)とは逆順に項目が取得/削除されている点と、辞書に項目がなければエラーとなる点に注目しよう。

追加した順序とは逆順に項目が返される 追加した順序とは逆順に項目が返される

 上記のコードの前に以下のコードを実行しているのは、Pythonのバージョンを確認するためだ。上の画像ではPython 3.6.7が使われていることが分かる。

import sys
print(sys.version)  # この環境のPythonのバージョンを確認する

Pythonのバージョンを確認するコード

 これに対して、筆者がローカルのWindowsマシンに検証用にPython 3.5.2をインストールして、その対話環境をコマンドプロンプトから起動して、上記のコードを実行した結果が以下だ。

Python 3.5.2の対話環境で上記コードを実行した結果 Python 3.5.2の対話環境で上記コードを実行した結果

 こちらでは異なる順序で項目が取得/削除されていることが分かる。

setdefaultメソッドによる項目の存在確認と追加

 辞書のsetdefaultメソッドは、特定のキーの値を取得することもできるが、値を取得するためのメソッドというよりは辞書に特定のキーに関連付けられた値があるかどうかの存在確認を行い、あればその値を戻り値として、なければキーと値の組を新規に辞書に追加するものだ。

setdefaultメソッド

setdefault(key[, default])


 辞書にkeyが存在すれば、そのキーの値を返す。なければ、keyとdefaultに指定した値の組を辞書に追加する(追加時には追加した値が戻り値となる)。defaultを省略した場合はNoneが指定されたものと見なされる。

パラメーター 説明
key 辞書に存在するかどうかを調べたいキー
default 辞書にキーが存在しなかったときに、追加する値(省略可能)。省略時にはNoneが指定されたものと見なされる
setdefaultメソッドのパラメーター


 以下に例を示す。

mydict = {'foo': 'foo', 'bar': 'bar'}
print(mydict.setdefault('foo'))  # 存在するキーを指定すれば、その値が返される
print(mydict.setdefault('baz', 'baz'))  # 存在しないキーを指定
print(mydict)

setdefaultメソッドの使用例

 実行結果を以下に示す。2番目のsetdefaultメソッド呼び出しで「'baz': 'baz'」という項目が追加されたことを確認してほしい。

実行結果 実行結果

Copyright© Digital Advantage Corp. All Rights Reserved.

編集部からのお知らせ

8月8日10時30分〜16時30分の間、システムメンテナンスのため記事の一部表示や資料のダウンロードができなくなります。ご理解のほどよろしくお願いいたします。

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。