
初心者が覚えておくべきdictのメソッドを9つ紹介します。
Table of Contents(目次)
keys() – dict内のすべてのkeyを取得
keys()メソッドは、dictのkeyの情報を取得します。
my_profile = {'name': 'Nico', 'age': 10}
keys = my_profile.keys()
print(keys) # dict_keys(['name', 'age'])
print(type(keys)) # <class 'dict_keys'>
上記コードを実行すると、dict_keys(['name', 'age'])という情報が得られ、変数"my_profile"のkeyが取得できていることが確認できます。このデータのタイプを調べると"dict_keys"と返され、listとは違うことが分かります。
"dict_keys"オブジェクトをprint出力した結果はlistに似ていますが、listよりもメモリ効率などの点で優れています。
"dict_keys"はlistとは違うので、listのメソッドを使うことはできません。また、keys[n]ように要素番号を使って値を取り出すこともできません。ただし、このデータはlistへ変換することができるので、listへ変換後、各要素に対して編集を行うことは可能です。
(データ構造の型変換については専用のレクチャーで解説します。)
また、"dict_keys"はlistに変換せずともforループで利用可能なので、dictのkey情報を使って繰り返し処理を行いたい場合にkeys()メソッドが使用されます。
(forループについては専用のレクチャーで解説します。)
以下、values()メソッド、items()メソッドから返されるデータ型についても同じです。
values() – dict内のすべての値を取得
values()メソッドは、dictのvalueの情報を取得します。
my_profile = {'name': 'Nico', 'age': 10}
values = my_profile.values()
print(values) # dict_values(['Nico', 10])
print(type(values)) # <class 'dict_values'>
上記コードを実行すると、dict_values(['Nico', 10])という情報が得られ、変数"my_profile"のvalueが取得できていることが確認できます。このデータのタイプを調べると"dict_values"と返されます。"dict_values"も、"dict_keys"オブジェクトと同じ特徴を持ちます。
items() – dict内のキーと値のペアを取得
items()メソッドは、dictのkeyとvalueのペアを取得します。
my_profile = {'name': 'Nico', 'age': 10}
items = my_profile.items()
print(items) # dict_items([('name', 'Nico'), ('age', 10)])
print(type(items)) # <class 'dict_items'>
上記コードを実行すると、dict_items([('name', 'Nico'), ('age', 10)])という情報が得られ、変数"my_profile"の各(key, value)が取得できていることが確認できます。このデータのタイプを調べると"dict_items"と返されます。"dict_items"も、"dict_keys"オブジェクトと同じ特徴を持ちます。
update() – 要素を追加・更新
update()メソッドは、他のdictの要素を結合するメソッドです。両方のdictに共通のkeyが存在しているときは、引数で渡したdictの情報に上書きされます。
my_profile = {'name': 'Nico', 'age': 10}
add_profile = {'age':99, 'friends': ['Emma', 'Jack']}
my_profile.update(add_profile)
print(my_profile) # {'name': 'Nico', 'age': 99, 'friends': ['Emma', 'Jack']}
更新された"my_profile"は、"age"が99に更新され、"friends"が追加されています。
update()は元のdictの情報を更新します。もし、元のdictは更新せずに、要素を結合した新しいdictを別の変数へ代入したいという場合は、merge(|)演算子の使用を検討してください。
setdefault() – keyがないときに値を追加
setdefault()の概要
setdefault()メソッドは、次のような挙動になります。
- 引数で指定したkeyが無ければ、新しいkeyをdictに追加します
- 引数で指定したkeyが存在しているときは、何も行いません
setdefault()メソッドの使いどころとしては、(1). あるkeyが存在していないとその後の処理を続けられず、(2). そのkeyが存在していたとしたらvalueの値に変更を加えたくない、といった場面で役立ちます。
keyが存在しているときの挙動
keyが存在しているときは何も変更を加えません。次のコードは、変数"my_profile"に'name'が存在しているため、何も変わりません。
my_profile = {'name': 'Nico', 'age': 10}
my_profile.setdefault('name')
print(my_profile) # {'name': 'Nico', 'age': 10}
keyが存在しないときの挙動
keyが存在していなければ、引数で指定したkeyを加えます。次のコードは、変数"my_profile"に'friends'が存在していないため、keyが加えられます。この時、デフォルトではNoneがvalueに設定されます。NoneはPythonで値が存在しないことを表す特別なオブジェクトです。
my_profile = {'name': 'Nico', 'age': 10}
my_profile.setdefault('friends')
print(my_profile) # {'name': 'Nico', 'age': 10, 'friends': None}
keyが存在しないときのデフォルト値
keyが加えられる時の、valueのデフォルト値を引数で指定することができます。setdefault(key, default_value)の書式で記述します。
my_profile = {'name': 'Nico', 'age': 10}
my_profile.setdefault('friends', [])
print(my_profile) # {'name': 'Nico', 'age': 10, 'friends': []}
上記のコードは、'friends'が存在しない時に、空のlist([])をvalueとするように指定しています。
keyが存在している時と存在しない時の挙動を確認する
'friends'が存在している時と存在しない時で、どのように挙動が変化するか確認してみましょう。
# 'friends'が存在する時
my_profile = {'name': 'Nico', 'age': 10, 'friends': ['Jack']}
my_profile.setdefault('friends', [])
my_profile['friends'].append('Emma')
print(my_profile) # {'name': 'Nico', 'age': 10, 'friends': ['Jack', 'Emma']}
# 'friends'が存在しない時
my_profile = {'name': 'Nico', 'age': 10}
my_profile.setdefault('friends', [])
my_profile['friends'].append('Emma')
print(my_profile) # {'name': 'Nico', 'age': 10, 'friends': ['Emma']}
上記コードのように記述しておけば、変数"my_profile"に'friends'の存在の有無にかかわらず、listのappend('Emma')をエラー無く実行させることが出来ます。
10行目のコードは、dictに'friends'が無ければエラー(KeyError)になりますし、'friends'のvalueがlist型でなければappend('Emma')の処理でエラーになります。ですので、setdefault()で確実にデータが存在している状況にしておくのは非常に大事なことです。
直接key, valueを追加する時との違い
dictは、dict[key] = valueの書式で、keyが存在しないときに新しくkey: valueを追加することができます。setdefault()メソッドとの違いは何でしょう。まずは、'friends'が存在しない時のコードを実行し、挙動を確認してみましょう。
# 'friends'が存在しない時
my_profile = {'name': 'Nico', 'age': 10}
my_profile['friends'] = []
my_profile['friends'].append('Emma')
print(my_profile) # {'name': 'Nico', 'age': 10, 'friends': ['Emma']}
'friends'が存在しない時は、setdefault()メソッドの時と結果は変わりません。新しく'friends': []のペアを追加する挙動はsetdefault('friends', [])と同じで、append('Emma')の処理も問題なく行われています。
次に、'friends'が存在する時のコードを実行し、挙動を確認してみましょう。
# 'friends'が存在する時
my_profile = {'name': 'Nico', 'age': 10, 'friends': ['Jack']}
my_profile['friends'] = []
my_profile['friends'].append('Emma')
print(my_profile) # {'name': 'Nico', 'age': 10, 'friends': ['Emma']}
'friends'が存在する時は、setdefault()メソッドとは結果が異なります。
このコードは、変数"my_profile"で定義した'friends': ['Jack']のvalueを、3行目のmy_profile['friends'] = []で空のlist([])に更新しています。その次の行で'Emma'がlistに加えられていますが、'Jack'の姿はそこにはいません。
『keyが存在していれば何もせず、keyが存在していなければ加える』という処理を使う機会は多いと思いますので、setdefault()メソッドは覚えておくと役立つでしょう。
(* ただし、強制的に空のlist([])に更新したいという場合は、dict[key] = []の書式を使う必要があります。)
get() – 指定したkeyの値を安全に取得
get()メソッドは、dictのkeyに対応するvalueを返します。通常のvar = dict[key]の場合、keyが存在しないとエラーになりますが、get()はエラーにならずにデフォルト値を返してくれます。
my_profile = {'name': 'Nico', 'age': 10}
friends = my_profile.get('friends')
print(friends) # None
上記コードのように、存在しない'friends'をget()で取得しようとすると、エラーにならずにNoneが返されます。
get()はデフォルト値を指定することもできます。get(key, default_value)のように記述します。
my_profile = {'name': 'Nico', 'age': 10}
friends = my_profile.get('friends', [])
print(friends) # []
上記コードは、デフォルト値に空のlist([])を指定した例になります。
get()はkeyが確実に存在するかどうかわからないような時に、『エラーで止まらないようにデフォルト値を返して処理を続行させたい』という場面で使えるメソッドになります。
dict.fromkeys() – イテラブルからdictを生成
dict.fromkeys()メソッドは、listやtupleのようなイテラブルなオブジェクトからkeyを取り、dictを作成します。この時、指定したデフォルト値がvalueに設定されます。
items = ['Apple', 'Banana', 'Orange'] # 商品の一覧
inventory = dict.fromkeys(items, 0) # 初期在庫をすべて 0 にする
print(inventory) # {'Apple': 0, 'Banana': 0, 'Orange': 0}
上記コードは、商品在庫を管理するプログラムの初期設定の様子です。
まずは、変数"items"に商品の一覧を代入します。次に、dict.fromkeys(items, 0)で、各商品に対して、在庫数の初期値0をvalueに設定したdictを生成します。このように、不特定多数のkeyに対して共通の初期値を設定したい場合に使用します。
※keyの数が少なく、有限で特定できる場合は、dict.fromkeys()を使う必要はありません。次のコードのように初期化できる時は、無理に使う必要はありません。
inventory = {
'Apple': 0,
'Banana': 0,
'Orange': 0
}
(最近のテキストエディタは複数行操作ができたり、AIによってコードの補完を行ってくれるので、上記コードのような初期化を大量に行わなければならない場合でも、昔に比べて楽になりました。)
pop() – 指定した要素を削除して値を取得
pop()メソッドは、keyが存在すればその値をdictから消去し、valueの値を返します。
pop()は、『dictにkeyが存在するかどうか』、『pop()にデフォルト値が設定されているかどうか』で、次のように挙動が変化します。
- pop(key)
- dictにkeyが存在していればdictから消去し、valueの値を返す
- dictにkeyが存在していなければエラー(KeyError)になる
- pop(key, default_value)
- dictにkeyが存在していればdictから消去し、valueの値を返す
- dictにkeyが存在していなければdefault_valueの値を返す
次のコードは、'name'をdictから取り除く処理を行っています。my_profile.pop('name')で変数"my_profile"から'name': 'Nico'が取り除かれ、変数"result"にvalue('Nico')が返されます。
my_profile = {'name': 'Nico', 'age': 10}
result = my_profile.pop('name')
print(my_profile) # {'age': 10}
print(result) # Nico
dictに指定したkeyが存在しない場合、pop()にデフォルト値が設定されていなければエラーになります。
my_profile = {'name': 'Nico', 'age': 10}
result = my_profile.pop('zzz') # Error
pop()にデフォルト値が設定されている時は、dictに指定したkeyが存在しない時でもエラーにならず、デフォルト値が変数"result"に代入されます。変数"my_profile"の中身は変わりません。
my_profile = {'name': 'Nico', 'age': 10}
result = my_profile.pop('zzz', 0)
print(my_profile) # {'name': 'Nico', 'age': 10}
print(result) # 0
popitem() – 最後に追加された要素を削除して取得
popitem()メソッドは、1番最後に追加された(key, value)の対をdictから消去し返します。
my_profile = {'name': 'Nico', 'age': 10}
result = my_profile.popitem()
print(my_profile) # {'name': 'Nico'}
print(result) # ('age', 10)
上記コードを実行すると、変数"my_profile"から('age', 10)が取り除かれ、変数"result"にその対が代入されているのが確認できます。
popitem()メソッドは、消去する要素が存在しないとKeyErrorが発生します。エラーを回避するには、dictの要素が存在するかどうかを事前に確認します。(if文については条件分岐のセクションで学習します。)
my_profile = {}
result = None
if my_profile:
result = my_profile.popitem()
print(my_profile) # {}
print(result) # None






