辞書はリストと同じように、複数の値を管理するために使用します。
リストと異なる点は、値に順番がなく、データにアクセスする場合はインデックス番号ではなく「キー」を使う点です。
ここでは「キーって一体何?」「辞書の使い方は?」という方向けに、辞書の基本的な使い方を解説します。
YouTubeも公開していますので、動画や音声で聞きたい方はぜひご覧ください。
辞書の初期化
辞書は「キー」と「値」をペアとした値をカンマ区切りで入れることで初期化できます。
[構文]
{キー1:値1, キー2:値2, キー3:値3, …}
「キー:値」の組み合わせのことを、ここでは分かりやすくするため「要素」と呼びます。
コロンの両端、カンマの後ろの空白は、見やすくするために入れているので、なくても構いません。
では実際に辞書を初期化してみましょう。
dict = {"S":150, "M":160, "L":170}
print(dict)
[出力結果]
{'S': 150, 'M': 160, 'L': 170}
辞書をそのまま出力すると、辞書の中身がそのまま出力されます。
また、要素は型が混在していても問題ありません。
dict = {10:"abc", "20":True, 30:10.5}
print(dict)
[出力結果]
{10: 'abc', '20': True, 30: 10.5}
辞書の参照・更新・登録
次に辞書内のデータの参照と更新の方法を見ていきましょう。
リストではリスト内のデータにアクセスする場合は「インデックス番号」を使っていましたが、辞書では「キー」を指定して辞書内のデータにアクセスします。
参照
まずは参照から見ていきましょう。
先ほどのコードから、キーが「M」の値を取得します。
dict = {"S":150, "M":160, "L":170}
m = dict["M"]
print(m)
[出力結果]
160
まず1行目は変数dictに辞書を初期化しています。次に2行目で変数mに、辞書内でキーが「M」のデータを取得し、代入しています。最後にmを出力しています。
このように、リストではインデックス番号でしたが、辞書ではキーを使って辞書内のデータにアクセスします。
ちなみに、同じキーが複数辞書内にある場合は「最も後に追加した要素」が取得できます。
dict = {"M":150, "M":160, "M":170} #キーは全てM
m = dict["M"]
print(m)
[出力結果]
170
これは、最後に追加された要素以外の要素が自動的に削除されるからです。
更新
次に更新する方法を見ていきましょう。
更新は参照の場合と同じくキーを使います。
dict = {"S":150, "M":160, "L":170}
print("辞書更新前")
print(dict)
dict["L"] = 180
print("辞書更新後")
print(dict)
[出力結果]
辞書更新前
{'S': 150, 'M': 160, 'L': 170}
辞書更新後
{'S': 150, 'M': 160, 'L': 180}
3行目でキーが「L」のデータを180に変えています。変更前と変更後でキーがLの値が180に変わっているのが分かります。
登録
次に登録ですが、登録は更新と変わりません。更新ではすでに存在するキーを指定しましたが、登録の場合は存在しないキーを指定することで可能です。
dict = {"S":150, "M":160, "L":170}
dict["LL"] = 190
print(dict)
[出力結果]
{'S': 150, 'M': 160, 'L': 170, 'LL': 190}
update()を使った要素の追加・更新
update()を使うことで、辞書を使って辞書の要素を追加・更新できます。
また、update()は次の2つの処理を行います。
- 追加する辞書のキーがすでに存在する場合、値を更新する
- 追加する辞書のキーが存在しない場合、要素ごと追加する
実際にやってみましょう。
dict = {1:"A", 10:"DD", 100:"EEE"}
dict2 = {10:"BB", 100:"DDD", 1000:"EEEE"}
dict.update(dict2)
print(dict)
[出力結果]
{1: 'A', 10: 'BB', 100: 'DDD', 1000: 'EEEE'}
dictとdict2で被っているキーは10と100です。これらのキーの値はdict2の値で上書きされています。
また、dict2にのみ存在する要素に1000があります。1000のキーの要素はそのままdictに追加されます。
要素を削除する
辞書内の要素を削除したい場合はdelやpop()を使います。
delを使った削除
まずは例を見てみましょう。
dict = {"S":150, "M":160, "L":170}
del dict["M"]
print(dict)
[出力結果]
{'S': 150, 'L': 170}
delの後に削除したい要素を指定します。指定した要素が存在しない場合はKeyErrorになります。
pop()を使った削除
次にpop()です。辞書のpop()はリストのpop()と同じく辞書から要素を抜き出して返却するメソッドですが、辞書は要素の順序を持っていないので、抜き出したい要素のキーを指定する必要があります(指定しなかった場合はTypeErrorになります)。
dict = {"S":150, "M":160, "L":170}
size_m = dict.pop("M")
print(dict)
print(size_m)
[出力結果]
{'S': 150, 'L': 170}
160
キー・値をリストに変換する
ここでは辞書のキーや値、またはその両方をリストとして取り出す方法を見ていきましょう。
キーを取り出すにはkeys()を、値を取り出すにはvalues()を、キーと値のセットをリストに変換するにはitems()を使います。
キーの一覧を取得する-key()
keys()を使えば辞書の全てのキーをリストにして取り出せます。
dict = {"S":150, "M":160, "L":170}
keys = dict.keys()
print(type(keys))
print(list(keys))
[出力結果]
<class 'dict_keys'>
['S', 'M', 'L']
dict.keys()でキーのみ全て取り出しています。取り出したキーはdict_keys型のデータなので、list()を使って変換すると使いやすくなります。
値の一覧を取得する-values()
values()を使えば辞書の全ての値をリストにして取り出せます。
dict = {"S":150, "M":160, "L":170}
values = dict.values()
print(type(values))
print(list(values))
[出力結果]
<class 'dict_values'>
[150, 160, 170]
values()もkeys()と似てdict_values型のデータを返すので、list()で変換しましょう。
キーと値のセットを全て取得-items()
items()はキーと値のセットをタプルで取得するメソッドです。
こちらも例に漏れずdict_items型のデータを返すので、list()で変換しましょう。
dict = {"S":150, "M":160, "L":170}
items = dict.items()
print(type(items))
print(list(items))
[出力結果]
<class 'dict_items'>
[('S', 150), ('M', 160), ('L', 170)]
応用:辞書の内包表記
最後に辞書の内包表記を見ていきましょう。
リストと同じく、辞書でも内包表記ができます。
まずは例を見てみましょう。基本的にはリストと同じですが、辞書ではイテラブルの値がキーになります。
import random
keys = ["apple", "orange", "banana"]
dict = {key:random.randint(1,100) for key in keys}
print(dict)
[出力結果]
{'apple': 79, 'orange': 40, 'banana': 18}
構文は以下の通りです。
[構文]
{キー:値 for キー in イテラブル}
イテラブルにはリストを代入しています。リスト内のデータを一つずつキーに取り出して入れていくイメージです。
また、今回値を入れるために「randint」という関数を使っています。これは、第一引数と第二引数の間の整数をランダムで取得する関数です。1行目でrandomというモジュールをインポートすることで使えるようになります。
モジュールとは、プログラムを作るための「部品」のことです。
randomモジュールは、ランダムな値を作る機能を持った「部品」です。
試しに何度か実行してみると、毎回違った値が辞書に格納されるのが分かります。