akuruhinode's blog

pythonやC#を中心に興味を持った内容について調べています。

Python 辞書の使い方

はじめに

連続した値をキーとバリュー(値)のペアとして保持可能な辞書の使い方について、サンプルコードを用いて説明します。

記述方法

辞書の記述方法は以下の通りです。

  • {}(波かっこ)でくくる
  • キー・バリュー・ペア(キーと対応する値の組)をカンマで区切る
  • キーとバリューを:(コロン)で区切る
book = {'title': 'python sample', 'auther': 'tanaka taro', 'price': 2980} # 辞書の作成

注意点
キーには文字列型だけではなく整数型も利用可能ですが、いずれも順序は不定です。そのため、リストのようにスライス(例:[1:5])を利用して範囲を取得することはできません。

初期化

以下のようにキーと値を含まない波かっこを指定するとリストを初期化できます。この状態ではsampleは要素を持たない空の辞書の状態です。

sample = {} # 空の辞書を作成

値の取得

以下のようにキーを指定することで、値を取得できます。

book = {'title': 'python sample', 'auther': 'tanaka taro', 'price': 2980}
print(book['title']) # 'title'の値を取得
python sample

注意点
存在しない要素を指定すると、KeyErrorというエラーが発生します。

キーと値をリスト形式で取得

キーの取得

keys()メソッドを利用することで、キーをリスト形式で取得できます。

book = {'title': 'python sample', 'auther': 'tanaka taro', 'price': 2980}
for k in book.keys():
    print(k)  # キーを表示
title
auther
price

値の取得

values()メソッドを利用することで、値をリスト形式で取得できます。

book = {'title': 'python sample', 'auther': 'tanaka taro', 'price': 2980}
for v in book.values():
    print(v)  # 値を表示
python sample
tanaka taro
2980

キー・バリュー・ペアの取得

items()メソッドを利用することで、キーと値をリスト形式で取得できます。リストの各要素には、キーと値がタプル形式で格納されています。forループで以下のように指定することで、キーと値を同時に取得できます。

book = {'title': 'python sample', 'auther': 'tanaka taro', 'price': 2980}
for k, v in book.items():
    print(k + ':' + str(v))  # キー・バリュー・ペアを表示
title:python sample
auther:tanaka taro
price:2980

注意点
keys()values()items()メソッドが返す値はリスト形式、タプル形式です。実際のリスト、タプルとは異なり、list.append()のような処理は実行できません。
以下のコードを見てわかる通り、型がdict_keysのようになっており通常のリストやタプルとは異なります。

print(book.keys())  # key()の戻り値を表示
print(book.values())  # values()の戻り値を表示
print(book.items())  # items()の戻り値を表示
dict_keys(['title', 'auther', 'price'])
dict_values(['python sample', 'tanaka taro', 2980])
dict_items([('title', 'python sample'), ('auther', 'tanaka taro'), ('price', 2980)])

値の登録

キーが存在している場合も必ず登録

辞書[登録するキー] = 登録する値のように記述することで、辞書にキーと値を登録できます。

book = {'title': 'python sample', 'auther': 'tanaka taro', 'price': 2980}
book['date'] = '2021/01/20' # キーと値を登録
print(book)
{'title': 'python sample', 'auther': 'tanaka taro', 'price': 2980, 'date': '2021/01/20'}

ただしこのやり方では、すでにキーが存在している場合でも値を上書きしてしまいます。

book = {'title': 'python sample', 'auther': 'tanaka taro', 'price': 2980}
book['price'] = 5000 # すでに存在するキーに値を登録
print(book)
{'title': 'python sample', 'auther': 'tanaka taro', 'price': 5000}

キーが存在しない場合のみ値を登録したい場合はsetdefault()メソッドを利用します。

キーが存在しない場合のみ登録

setdefault()メソッドを利用すると、キーが存在しない場合のみ、値を登録することができます。このためget()メソッドと同様、コードを簡潔に記述できます。
以下の実行結果の通り、キーが存在しない'auther'は登録されていますが、すでにキーが存在する'price'の値は変更されていません。

book = {'title': 'python sample', 'price': 2980}
book.setdefault('auther', 'tanaka taro')
book.setdefault('price', 5000) # すでに存在するキーに値を登録

print(book) # 変更後の辞書を表示
{'title': 'python sample', 'price': 2980, 'auther': 'tanaka taro'}

キーや値の検索

in演算子not in演算子を利用することで、辞書にキーや辞書が含まれているかを検索できます。
以下は説明を簡略化するためにin演算子not in演算子のみを直接利用していますが、実際にはif文など条件文と組み合わせて利用することが多いと思います。

キーを検索したい場合はkeys()メソッドを利用するか、単純に辞書を指定します。値を検索したい場合はvalues()メソッドを利用します。

book = {'title': 'python sample', 'auther': 'tanaka taro', 'price': 2980}
print('title' in book.keys()) # キーに'title'が存在するか
print('auther' not in book.keys()) # キーに'auther'が存在しないか(False=存在する)
# 以下も同じ結果が得られる
# print('title' in book)
# print('auther' not in book)

print('tanaka taro' in book.values()) # 値に'title'が存在するか
print(2980 not in book.values()) # 値に2980が存在しないか(False=存在する)
True 
False
True
False

キーが存在しない場合の戻り値を指定

get()メソッドを利用すると、キーが存在しない場合の戻り値を指定できます。キーが存在しない場合でもKeyErrorが発生しないため、コードを簡潔に記述できます。

book = {'title': 'python sample', 'price': 2980}
print('title is ' + book.get('title', 'none') + '.') # 'title'が存在しない場合はnoneを返す
print('auther is ' + book.get('auther', 'none') + '.') # 'auther'が存在しない場合はnoneを返す
title is python sample.
auther is none.

キーと値の入れ替え

以下のようにfor文を利用すればキーと値を入れ替えることができますが、これは少々冗長です。

book = {'title': 'python sample', 'auther': 'tanaka taro', 'price': 2980}
book_replaced = {}
for k, v in book.items():
    book_replaced[v] = k
print(book_replaced) # キーと値を入れ替えた辞書を表示
{'python sample': 'title', 'tanaka taro': 'auther', 2980: 'price'}

キーと値を入れ替えたい場合は、以下のようにすると1行で記述できます。

book = {'title': 'python sample', 'auther': 'tanaka taro', 'price': 2980}
book_replaced ={v: k for k, v in book.items()}
print(book_replaced) # キーと値を入れ替えた辞書を表示