【Python入門】辞書の基本操作(追加・削除/ソート/初期化など)について解説
Pythonのデータ型の一つとして、ラベルとなるキー(key)と値をセットで管理する「辞書(dict)型」があります。
少し扱いが難しそうに感じるかもしれませんが、 辞書型が活躍する場面は数多くあるので、しっかりと基礎を身につけておくことが大切です。
この記事では、辞書を扱う上での基本的な使い方(追加・削除/ソート/初期化など)について解説していきます。
辞書(dict型)の定義については、以下の記事でくわしく説明しています。
辞書の中身を参照する
辞書型では要素を取り出すだけでなく、保持しているキーや要素のリストを取得することも可能です。
キーに対応する要素の取得
リスト内の要素を確認する場合は、辞書[]の形で記述します。
[]の中に参照したい要素の対となるキー(key)を指定することで、任意の値が取得可能です。
dc = {"key1": "テスト", "key2": 123, "key3": False} # dcという変数に、辞書を保持
profile = {"name": "太郎", "age": 22} # profileという変数に、辞書を保持
print(dc["key1"]) # dc(辞書型)の、キーがkey1の要素を表示
print(profile["age"]) # profile(辞書型)の、キーがageの要素を表示
= 実行結果 =
テスト
22
キーや要素の一覧を取得
辞書に存在するすべてのキーや値を確認する場合は、keys()
あるいはvalues()
メソッドを使用します。
辞書(変数)の後に「.keys()」を記述するとキーの一覧を、「.values()」を記述すれば要素の一覧を取得できます。
dc = {"key1": "テスト", "key2": 123, "key3": False} # dcという変数に、辞書を保持
print(dc.keys()) # dc(辞書型)のキーの一覧を表示
print(dc.values()) # dc(辞書型)の要素の一覧を表示
= 実行結果 =
dict_keys(['key1', 'key2', 'key3'])
dict_values(['テスト', 123, False])
keys()
とvalues()
では、それぞれの結果を「dict_keys型」「dict_values型」と呼ばれる特別なデータ型で返します。
通常のリスト型との違いとして、元となる辞書(変数)の中身が更新されると、対応する一覧の中身も自動で切り替わるといった特徴を持ちます。
dc = {"key1": "テスト", "key2": 123, "key3": False} # dcという変数に、辞書を保持
dc_keys = dc.keys() # dc_keysという変数に、dc(辞書型)のキーの一覧を保持
print(dc_keys) # dc_keys(dict_key型)の中身を表示
dc["追加キー"] = "追加した要素" # dcに新たな要素を追加
print(dc_keys) # dc_keysの中身を表示 ※通常、変数で保持した値は自動で更新されない
= 実行結果 =
dict_keys(['key1', 'key2', 'key3'])
dict_keys(['key1', 'key2', 'key3', '追加キー'])
キーと要素の組み合わせを取得
辞書に存在するキーと値の組み合わせを確認する場合は、items()
メソッドを使用します。
対象となる辞書(変数)の後に「.items()」を記述することで、キーと要素の組み合わせを取得できます。
なお、こちらの結果も先ほどと同様に「dict_items型」と呼ばれる特別なデータ型で返されます。
dc = {"key1": "テスト", "key2": 123, "key3": False} # dcという変数に、辞書を保持
print(dc.items()) # dc(辞書型)の組み合わせの一覧を表示
= 実行結果 =
dict_items([('key1', 'テスト'), ('key2', 123), ('key3', False)])
辞書を編集する
辞書(list)でもリスト型と同じく、要素の追加・削除や変更といった編集が可能です。
キーと要素を追加する
新たに要素を追加する場合は、「辞書(変数)[キー] = 要素」や|=
演算子を使用します。
前者では1つずつしか追加ができませんが、後者(|=
)は複数のキー・要素を追加することが可能です。
使用する際は、辞書(変数)の後に「|= 追加したい辞書」を記述することで追加できます。
この際、既に存在するキーを指定してしまうと値が上書きされる形で更新されてしまうため、重複しないように注意しましょう。
dc = {"key1": "テスト", "key2": 123} # dcという変数に、辞書を保持
dc["key3"] = False # dc(辞書)にキーがkey3の「False」を追加
print(dc) # dcの中身を表示
dc |= {"key4": "test", "key5": 3.14} # dcに、新たな辞書内のキー・要素を追加
print(dc) # dcの中身を表示
= 実行結果 =
{'key1': 'テスト', 'key2': 123, 'key3': False}
{'key1': 'テスト', 'key2': 123, 'key3': False, 'key4': 'test', 'key5': 3.14}
キーと要素を削除する
リスト内にある要素を指定して削除する場合は、pop()
メソッドやdel
文を使用します。
どちらもキーで指定した要素を削除できますが、del
文では複数のキーをまとめて指定可能です。
使用する際は、削除したい辞書(変数)の後に「.pop(キー)」、あるいは「del 辞書1[キー1], 辞書2[キー2]…」の形で記述します。
dc = {'key1': 'テスト', 'key2': 123, 'key3': False, 'key4': 'test'} # dcに、辞書を保持
dc.pop("key1") # dc(辞書)から、キーが「key1」の要素を削除
print(dc) # dcの中身を表示
del dc["key2"], dc["key3"] # dc(辞書)から、キーが「key2」「key3」の要素を削除
print(dc) # dcの中身を表示
= 実行結果 =
{'key2': 123, 'key3': False, 'key4': 'test'}
{'key4': 'test'}
要素の値を変更する
既にある要素を変更する場合は、「辞書[キー] = 変更後の要素」の形で記述します。
なお、指定する際に存在しないキーを指定してしまうと、新たな要素として追加されます。
dc = {"key1": "テスト", "key2": 123, "key3": False} # dcという変数に、辞書を保持
dc["key1"] = "test" # dc(辞書)にある、key1の要素を「test」に変更
print(dc) # dcの中身を表示
= 実行結果 =
{'key1': 'test', 'key2': 123, 'key3': False}
キーの値を変更する
要素に割り当てられているキーの変更は、 上でも紹介したpop()
メソッド を活用することで対応できます。
じつはpop()
メソッドでは、対象となる要素を辞書から取り出す形で削除します。
つまり、 「辞書.pop(キー) 」にて返された値を新たなキーとともに追加してあげることで、間接的にキーを変更することが可能です。
dc = {"key1": "テスト", "key2": 123, "key3": False} # dcという変数に、辞書を保持
dc["key4"] = dc.pop("key1") # dc(辞書)内の「key1」の要素を削除し、「key4」として追加
print(dc) # dcの中身を表示
= 実行結果 =
{'key2': 123, 'key3': False, 'key4': 'テスト'}
辞書をキーの値で並び替える(ソート)
辞書内にある要素を並び替える場合は、sorted()
関数を使用します。
「辞書 = sorted(辞書.items())」の形で記述すると、中のキーを昇順(0⇒9、a⇒z、あ⇒ん)に並び替えた辞書(変数)に置き換えることができます。
(「sorted(辞書)」のままでは正しく動作しないので、items()
メソッドにてキーと要素の組み合わせを指定します)
ただし、sorted()
が使えるのは辞書内のキーのデータ型が同一の場合のみなので注意してください。
dc = {"3": "テスト", "2": 123, "4": False, "1": "test"} # dcという変数に、辞書を保持
dc = sorted(dc.items()) # dcを、キーを昇順に並び替えた結果に置き換える
print(dc) # dcの中身を表示
dc = {1: "テスト", "b": 123, "a": False, 2: "test"} # dcの中身を変更(数値と文字列が混合)
dc = sorted(dc.items()) # この場合はエラーが発生
= 実行結果 =
[('1', 'test'), ('2', 123), ('3', 'テスト'), ('4', False)]
Traceback (most recent call last):
File "sample.py", line 6, in <module>
dc = sorted(dc.items())
TypeError: '<' not supported between instances of 'str' and 'int'
この際、並び替えられた結果はキーと要素の組み合わせ(タプル型)がリストに保持する形で返されます。
ソート後も辞書型として扱いたい場合は、dict()
関数での再変換が必要です。
dc = [('1', 'test'), ('2', 123), ('3', 'テスト'), ('4', False)] # dcに、リストを保持
dc = dict(dc) # dict()にて、dc(リスト)を辞書型に変換
print(dc) # dcの中身を表示
= 実行結果 =
{'1': 'test', '2': 123, '3': 'テスト', '4': False}
要素を降順 (9⇒0、z⇒a、ん⇒あ)や逆順にソートする方法は、別記事にて説明しています。
辞書を要素の値で並び替える(ソート)
リスト内にある要素を並び替える場合は、sorted()
関数にあわせて lambda
(ラムダ式)を使用します。
sorted()
関数にはkey
と呼ばれる引数があり、ソートする際に「どのような要素(値)を使って比較するか」の指定が可能です。
このkey
引数とラムダ式を組み合わせることで、キーではなく要素の値を用いた並び替えができるようになります。
辞書 = sorted(辞書.items(), key=lambda i: i[1])
(「lambda i:i[1]」の結果を用いて、辞書のソートを行う)
なお、こちらも辞書内の要素のデータ型が同一の場合のみでしかソートができませんのでご注意ください。
dc = {"key1": 4, "key2": -3, "key3": 12345, "key4": 0} # dcという変数に、辞書を保持
dc = sorted(dc.items(), key=lambda i: i[1]) # dcを、要素を昇順に並び替えた結果に置き換える
print(dc) # dcの中身を表示
dc = dict(dc) # dict()にて、dc(リスト)を辞書型に変換
print(dc) # dcの中身を表示
= 実行結果 =
[('key2', -3), ('key4', 0), ('key1', 4), ('key3', 12345)]
{'key2': -3, 'key4': 0, 'key1': 4, 'key3': 12345}
辞書の中身を検索する
辞書型でも、他の配列と同様に保持している内容を検索することができます。
この先では、キーや要素から必要な情報を確認する方法について紹介します。
指定のキーや要素が含まれているか確認
特定のキーや要素があるかどうかを確認する場合は、 「キー・要素の一覧を取得」にて紹介したkeys()
/values()
メソッドとin
演算子を組み合わせて使用します。
「キー in 辞書.keys()」あるいは「要素 in 辞書.values()」 を記述することで、キーや要素が存在するかどうかを真偽値(TrueまたはFalse)で返します。
dc = {"key1": "テスト", "key2": 123, "key3": False} # dcという変数に、辞書を保持
print("key1" in dc.keys()) # dc(辞書)に「key1」があるかどうかを表示
print("test" in dc.values()) # dcに「test」があるかどうかを表示
= 実行結果 =
True
False
指定の要素がいくつ含まれるかを確認
辞書内に要素がいくつ存在するかを確認したい場合は、 key()
/values()
メソッドとcount()
メソッドを使用します。
count()は、括弧内で指定された要素の個数を数えることができるメソッドです。
使用する際は、まず以下の手順にて保持している要素の一覧をリスト化します。
key()
あるいはvalues()
メソッドで、検索対象(キーor要素)の一覧を取得するlist()
関数を使用し、①の結果(dict_keys型/dict_values型)をリスト化する
その後、リスト化した一覧の後ろに「.count(要素)」を記述することで、指定した要素の個数を取得できるようになります。
dc = {1: "test", 2: 123, 3: False, 4: "test", 5: "test"} # dcという変数に、辞書を保持
dc_v = list(dc.values()) # dc_vという変数に、要素の一覧(dc.values())をリスト化して保持
print(dc_v.count("test")) # dc_v(リスト)より、「test」の個数を表示
= 実行結果 =
3
辞書の中身を初期化する
辞書を初期化する方法として、 キー・要素の削除や0(初期値)変換があげられます。
辞書内のキー・要素を空にする
辞書内のキーと要素をすべて削除したい場合は、clear()
メソッドを使用します。
使用する際は、辞書(変数)の後に「.clear()」の形で記述することで、中身を空にできます。
また、変数に保持している辞書であれば「変数 = {}」での初期化も可能です。
dc = {"key1": "テスト", "key2": 123, "key3": False} # dcという変数に、辞書を保持
dc.clear() # dc(辞書)の中身を削除
print(dc) # dcの中身を表示
dc = {"key1": "テスト", "key2": 123, "key3": False} # dcに、再び辞書を保持
dc = {} # dcの中身を{}(空の辞書)に書き換える
print(dc) # dcの中身を表示
= 実行結果 =
[]
[]
すべての要素を0(初期値)にする
リスト内の要素を0に置き換えたい場合は、keys()
メソッドとfor
文を組み合わせて使用します。
辞書のキー一覧をkeys()
メソッドで取得し、「辞書[キー] = 初期値」といった置き換え処理をfor
文にて繰り返すことで、すべての要素を初期値にすることができます。
for文の概要や使い方については、別記事にて詳しく説明しています。
dc = {"key1": "テスト", "key2": 123, "key3": False} # dcという変数に、辞書を保持
for key in dc.keys(): # キーの一覧を使って、要素を0にする処理を繰り返す
dc[key] = 0
print(dc) # dc(辞書)の中身を表示
= 実行結果 =
{'key1': 0, 'key2': 0, 'key3': 0}
まとめ
この記事では、辞書(dict)を扱う上での基本的な使い方について解説しました。
要素に加えてキーも管理する必要があるため、扱いがややこしい部分もあるかと思いますが、慣れてしまえば非常に重宝するデータ型です。
日頃から少しずつ活用して、扱い方を覚えていくようにしましょう。