辞書(dict)型の使い方
基本文法

辞書(dict)型の使い方

         

辞書はリストと同じように、複数の値を管理するために使用します。

リストと異なる点は、値に順番がなく、データにアクセスする場合はインデックス番号ではなく「キー」を使う点です。

ここでは「キーって一体何?」「辞書の使い方は?」という方向けに、辞書の基本的な使い方を解説します。

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モジュールは、ランダムな値を作る機能を持った「部品」です。

試しに何度か実行してみると、毎回違った値が辞書に格納されるのが分かります。

タイトルとURLをコピーしました