
初心者が覚えておくべき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