本記事では、pythonで用いられるデータ型の一つである辞書型についてその使い方といくつかのメソッドを紹介していこうと思います。
そもそも「辞書って何?」というところから始まり、コピー方法やメソッドの説明などの実践的な部分まで説明しているのでぜひ最後まで見ていってください。
ちなみに、本ブログでは初心者の方でも理解できるように丁寧に説明しているので、全くの初心者という方も安心してください。
また、pythonをまだインストールしていないといった方は以下の記事を参考にしてインストールしてみましょう。
この記事でわかること
- 辞書について
- 辞書の使い方
- 辞書のコピー方法
- 辞書のメソッド
辞書について
まずは、pythonにおける辞書とはどのようなもののことを指すのかについて説明させていただこうと思います。
また、似たようなデータ型に『リスト』、『タプル』といったものがあるのですが、知らないという方は以下の記事から先に見ることをおすすめします。
辞書とは?
辞書とは、『複数のkeyとvalueの組み合わせをまとめたもの』です。
ここで、『value』というのはその組み合わせの値となるもので、『key』とはその値を検索するための索引みたいなものだと思ってもらえれば大丈夫です。
恐らく皆さん、辞書と聞くと真っ先に国語辞典のようなものを思い浮かべると思います。
国語辞典でも、各用語に『用語名』と『説明文』が載っていますよね。
pythonにおける辞書ではこの用語名に対応するのが『key』で、説明文に対応するのが『value』といった感じです。
とりあえず、keyとvalueがセットで一つの要素として辞書の中に含まれるんだなと思っていてください。
<input>
dictionary = {"x": 10, "y": 20}
print(dictionary, type(dictionary))
<output>
{'x': 10, 'y': 20} <class 'dict'>
また、辞書は上記のコードのような形で宣言することが出来ます。
xやyが『key』、10や20が『value』といった感じです。
keyやvalueの型
<input>
dictionary1 = {"x": 10, "y": 20}
dictionary2 = {"x": "one", "y": "two"}
dictionary3 = {1: 500, 2: 1000}
print(dictionary1, type(dictionary1))
print(dictionary2, type(dictionary2))
print(dictionary3, type(dictionary3))
<output>
{'x': 10, 'y': 20} <class 'dict'>
{'x': 'one', 'y': 'two'} <class 'dict'>
{1: 500, 2: 1000} <class 'dict'>
辞書のkeyやvalueの型なんですが、int型やfloat型の数値でも、string型の文字列でもどちらでもOKです。
最初の例のようにkeyは文字列で、valueは数値を使わなければならないといったルールは特にないので、そこは気にしなくて大丈夫ですね。
valueの参照方法
<input>
dictionary = {"x": 10, "y": 20}
print(dictionary["x"])
print(dictionary["y"])
<output>
10
20
辞書では、リストやタプルなどと異なり、要素に番号が割り振られていません。
なので、valueを取り出すためにはkeyを用いて要素を指定してあげる必要があります。
valueの変更
<input>
dictionary = {"x": 10, "y": 20}
dictionary["x"] = 100
dictionary["y"] = 200
print(dictionary)
<output>
{'x': 100, 'y': 200}
こちらも、要素に番号が割り振られていないため、keyを指定してそのkeyに対応するvalueを代入するといった形になっています。
要素の追加
<input>
dictionary = {"x": 10, "y": 20}
dictionary["z"] = 30
print(dictionary)
<output>
{'x': 10, 'y': 20, 'z': 30}
新たに要素を追加したい場合は、現在存在しないkeyを用いてそのkeyに対応するvalueを代入してあげればOKです。
辞書作成の際の注意点
ここまで、辞書の様々な操作に触れてきましたが、ここで辞書を作成するうえでの注意点が一つだけあります。
それは『keyとvalueを1対1対応にすること』です。
要するに、一つのkeyに対するvalueを複数個設定するのはダメというわけです。
具体的にそのダメな例をコードを用いて説明しますね。
dictionary = {"x": 10, "y": 20, "z": 30, "z": 40}
こんな感じです。
辞書の中身をこのようにしてしまうと、valueの参照や変更を思った通りに実行できなくなってしまいます。
注意しましょう。
【補足】その他の宣言方法
また、補足として辞書のその他の宣言方法も載せておきます。
基本的に使わないと思うので「こんなのもあるんだな」くらいで大丈夫です。
<input>
dictionary1 = dict(a=10, b=20)
dictionary2 = dict([("a", 10), ("b", 20)])
print(dictionary1)
print(dictionary2)
<output>
{'a': 10, 'b': 20}
{'a': 10, 'b': 20}
辞書のコピー
続いては、辞書のコピーについてです。
辞書のコピーに関しては、気を付けるべきポイントがリストコピーの時と同じなので、リストのコピー方法をすでに知っているという方は軽く読み飛ばしてください。
正常に動作しない?間違ったコピー方法
<input>
dictionary = {"x": 10, "y": 20}
new_dictionary = dictionary
dictionary["x"] = 100
print(dictionary)
print(new_dictionary)
<output>
{'x': 100, 'y': 20}
{'x': 100, 'y': 20}
皆さんは、この出力結果を見て何か氏らの違和感を感じますか?
今回のコードでは、new_dectionaryにdictionaryの内容をコピーして、その後dictionaryに変更を加えているのですが、new_dictionaryの中身を見たところ同じ変更が加えられてしまっています。
new_dictionaryに対して何もしていないのになぜでしょう。
この問題を理解するためには「値渡し」と「参照渡し」に関する知識が必要なので、「そんな言葉知らない」という方は以下の記事を参考にして下さい。
正常に動作しなかった原因
正常に動作しなかった原因は、辞書のデータが参照渡しによって渡されているからです。
new_dictionaryには、dictionaryの住所のみが格納される形になっているため、dictionaryの中身を変更するとnew_dictionaryの中身もそれに合わせて変更されてしまいます。
もちろん逆もしかりで、new_dictionaryの中身を変更すると、dictionaryの中身も変わってしまうのです。
では、辞書のコピーが出来ないのかというとそういうわけではありません。
以下で、正常に辞書をコピーする方法をご紹介いたします。
正しい辞書のコピー方法
では、先ほどの問題点を踏まえたうえで正しい辞書のコピー方法を確認していきましょう。
<input>
dictionary = {"x": 10, "y": 20}
new_dictionary = dictionary.copy()
dictionary["x"] = 100
print(dictionary)
print(new_dictionary)
<output>
{'x': 100, 'y': 20}
{'x': 10, 'y': 20}
これで正常にコピーが行えました。
先ほどのコードと比べて変更した点は、一行のみです。
先ほどのコードでは、『new_dictionary = dictinary』と記述していたので、dictionaryのデータをnew_dictionaryに参照渡ししてしまっていたのですが、今回のコードは『dictionary.copy()』といったdictionaryのコピーをnew_dictionaryに渡しているので値渡しを行っていることになります。
辞書をコピーした後、どちらかの辞書のみを操作したいという場合はこのような処理を書かないと正常に動作しないので気を付けましょう。
辞書の様々なメソッド
ここからは、以下の順番で辞書のメソッドを一部紹介していこうと思います。
- keys:全てのkeyを参照する
- values:全てのvalueを参照する
- get:指定のvalueを参照する
- pop:指定のvalueを取り出す
- del:要素を削除する
- clear:辞書を空にする
- update:辞書の更新を行う
- in:指定のkeyの存在を確認する
keys:全てのkeyを参照する
<input>
dictionary = {"x": 10, "y": 20}
print(dictionary.keys())
<output>
dict_keys(['x', 'y'])
keysを用いると、辞書内のすべてのkeyを見ることが出来ます。
values:全てのvalueを参照する
<input>
dictionary = {"x": 10, "y": 20}
print(dictionary.values())
<output>
dict_values([10, 20])
valuesを用いると、辞書内のすべてのvalueを見ることが出来ます。
get:指定のvalueを参照する
<input>
dictionary = {"x": 10, "y": 20}
# どちらでもOK
print(dictionary.get("x"))
print(dictionary["x"])
# print(dictionary["z"])のみエラー
print(dictionary.get("z"))
print(dictionary["z"])
<output>
10
10
None
# エラー
KeyError: 'z'
getは、keyを指定してそのkeyに対応するvalueを参照するといったメソッドです。
実はこれ、別にgetを使わなくとも上記のコードのように出来てしまうんですね。
しかし、辞書にないkeyを指定した場合は、getを使わないとエラーが出るといった形になっています。
ちなみに、getを用いると『None』という結果が返ってきます。
pop:指定のvalueを取り出す
<input>
dictionary = {"x": 10, "y": 20}
print(dictionary.pop("x"))
print(dictionary)
<output>
10
{'y': 20}
popは、指定したkeyに対応するvalueを取り出すといった処理を行います。
なので、『pop("x")』を使用した後にdictionaryを見ると、keyがxの要素が丸々なくなっていることになります。
del:要素を削除する
<input>
dictionary = {"x": 10, "y": 20}
del dictionary["x"]
print(dictionary)
<output>
{'y': 20}
delを用いると、指定の要素を辞書から削除することが出来ます。
clear:辞書を空にする
<input>
dictionary = {"x": 10, "y": 20}
dictionary.clear()
print(dictionary)
<output>
{}
clearはdelの強化版で、指定した辞書のすべての要素を消して空にすることが出来ます。
update:辞書の更新を行う
<input>
dictionary = {"x": 10, "y": 20}
new_dictionary = {"x": 100, "z": 300}
dictionary.update(new_dictionary)
print(dictionary)
<output>
{'x': 100, 'y': 20, 'z': 300}
updateは辞書の更新を行うためのメソッドです。
今回は、『dictionary』の更新を『new_dictionary』を用いて行っているといった感じですね。
ここで更新というのは次のような操作のことを指します。
①更新元(dictionary)にkeyが同じ要素がある場合、valueを書き換える。
②更新元(dictionary)にkeyが同じ要素がない場合、新たな要素を加える。
in:指定のkeyの存在を確認する
<input>
dictionary = {"x": 10, "y": 20}
print("x" in dictionary)
print("a" in dictionary)
<output>
True
False
inを用いると、指定のkeyが辞書内に存在するかどうかがわかります。
存在するならば『True』を出力して、存在しないならば『False』を出力するといった形になっています。
まとめ
今回は、辞書についてその使い方からたくさんのメソッドまで紹介してきましたが理解は深まったでしょうか。
リストやタプルと異なり、keyを用いて要素を取り出すのが特徴的ですよね。
辞書を作成するうえでの注意点も述べているので、そういった部分に注意しながら、みなさんも手を動かして実際に辞書型のデータを扱ってみましょう。