今回はdictionary(辞書)型。他の言語では連想配列などとも呼ばれます。
辞書といえば目次や索引があり、そこから目的の単語などを探し出すスタイルですよね。
Pythonの辞書もまさにそんな感じです。こちらでは主に
- 辞書型の作成方法
- 要素へのアクセス
- 要素の追加と削除
といった辞書型の基本についてお話します。
辞書型の新規作成
では実際に辞書を作成してみましょう。
dic1 = {68:"リーチ・マイケル",34:"稲垣啓太",63:"田村優"}
dic2 = {"respect":"尊重する",
"will":"権利",
"individual":"個人"}
empty_dic = {}
print(type(empty_dic)) #<class 'dict'>
これで3つの辞書型が作成されました。type関数を使うと「dict」と表示されます。
1行では長くなりすぎる場合、テキストエディタであれば項目の終わりのカンマの後でエンターを入力することで、列を揃えて記述することができます。
list型と違うのは角括弧ではなく波括弧{}を使用するところと、値は2つで1組というところです。要素の左側の値を「キー」、コロンを挟んで右側を「バリュー」と呼びます。
各要素へのアクセス
それでは上で作成した辞書型の要素へアクセスしてみましょう。
print(dic1[34]) #稲垣啓太
print(dic2["individual"]) #個人
list型の場合、値を管理しているのはインデックス番号ですが、辞書型ではキーを使ってバリューにアクセスできます。逆は(この方法では)できません。
list型と同様ですが、存在しないキーを指定してしまうとエラーになります。
print(dic1[35]) #KeyError: 35
キーがあるかどうかを調べる
上のエラーを回避するためには、あらかじめそのキーが辞書に登録されているのかどうかを調べてみるのが安全ですが、そのような状況で使えるのがin/not in演算子です。
dic1 = {68:"リーチ・マイケル",34:"稲垣啓太",63:"田村優"}
print(78 in dic1) #False
print(68 in dic1) #True
2行目と3行目ではin演算子を使って、「このキーはこの(辞書の)中に入っているよね?」とPythonに尋ねています。
その値がキーとして入っていればTrueが、入っていなければFalseが答えとして返ってきます。
逆に「このキーはこの中に入っていないよね?」と尋ねるのがnot in演算子です。
dic1 = {68:"リーチ・マイケル",34:"稲垣啓太",63:"田村優"}
print(78 not in dic1) #True
print(68 not in dic1) #False
当然、先ほどと答えは逆になります。
キーはユニークでイミュータブル
このようにキーを使ってバリューにアクセスする辞書型は、キーの設定に関しては若干シビアになっています。決まりとして、
- 1つの辞書型の中に、同じキーは2つ以上設定できない (ユニークな値であること)
- キーはイミュータブルな値でなくてはならない (変更されないこと)
この2点が定められています。
2に関しては難しいという方もいるかも知れませんが、要はlist型や辞書型は辞書のキーにはなれないということです。文字列や整数、タプルであれば問題はありません。
辞書型を作成する場合には重複したキーが無いか、変更される心配の無い型を使用しているかどうかをチェックしましょう。
要素を追加/変更する
dic2 = {"respect":"尊重する",
"will":"権利",
"individual":"個人"}
dic2["take it easy"] = "気楽にやれ"
print(dic2)
#{'respect': '尊重する', 'will': '権利', 'individual': '個人', 'take it easy':
'気楽にやれ'}
辞書に項目を追加するには「辞書名[キー] = バリュー」と記述します。
キーとは違ってバリューは同じ値が複数あってもかまいません。またlist型や辞書型もバリューとして登録できます。
dic = {"take it easy":["気楽にやれ","くよくよするな","じゃあね"]}
print(dic["take it easy"]) #['気楽にやれ', 'くよくよするな', 'じゃあね']
print(dic["take it easy"][2]) #じゃあね
リストのようなコンテナ型をバリューとした場合、「辞書名[キー]」とするとバリューそのまま、「辞書名[キー][インデックス番号]」とすると、リストの中にある個別の要素にアクセスすることが可能です。
キーを変更せずにバリューだけ更新するのであれば、上と同じ書き方で既にあるキーを指定すればバリューのみ変更することができます。
dic = {"positive":"前向きな"}
dic["positive"] = "明確な"
print(dic) #{'positive': '明確な'}
要素を削除する
辞書から要素を削除する最もポピュラーな方法はdel文です。
dic = {68:"リーチ・マイケル",34:"稲垣啓太",63:"田村優"}
del dic[34]
print(dic) #{68: 'リーチ・マイケル', 63: '田村優'}
個別のバリューにアクセスするときと同様、del 辞書名[キー]で削除したい値を選択します。
またこの方法では、複数の項目をカンマで区切って1度に削除することも可能です。
dic = {68:"リーチ・マイケル",34:"稲垣啓太",63:"田村優"}
del dic[34],dic[63]
print(dic) #{68: 'リーチ・マイケル'}
要素を丸ごと削除するのであれば、clearメソッドを使用しましょう。
dic = {"positive":"前向きな"}
dic.clear()
print(dic) #{}