sec02 - dictメソッド

初心者が覚えておくべきdictのメソッドを9つ紹介します。

スポンサーリンク

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"オブジェクトとは

"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のkeyvalueのペアを取得します。

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()メソッドは、次のような挙動になります。

  1. 引数で指定したkeyが無ければ、新しいkeyをdictに追加します
  2. 引数で指定した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が加えられます。この時、デフォルトではNonevalueに設定されます。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)で、各商品に対して、在庫数の初期値0valueに設定したdictを生成します。このように、不特定多数のkeyに対して共通の初期値を設定したい場合に使用します。

keyの数が少なく、有限で特定できる場合は、dict.fromkeys()を使う必要はありません。次のコードのように初期化できる時は、無理に使う必要はありません。

inventory = {
    'Apple': 0,
    'Banana': 0,
    'Orange': 0
}

(最近のテキストエディタは複数行操作ができたり、AIによってコードの補完を行ってくれるので、上記コードのような初期化を大量に行わなければならない場合でも、昔に比べて楽になりました。)

pop() – 指定した要素を削除して値を取得

pop()メソッドは、keyが存在すればその値をdictから消去し、valueの値を返します。

pop()は、『dictにkeyが存在するかどうか』、『pop()にデフォルト値が設定されているかどうか』で、次のように挙動が変化します。

  1. pop(key)
    • dictにkeyが存在していればdictから消去し、valueの値を返す
    • dictにkeyが存在していなければエラー(KeyError)になる
  2. pop(key, default_value)
    1. dictにkeyが存在していればdictから消去し、valueの値を返す
    2. 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
スポンサーリンク