こんにちは(@t_kun_kamakiri)(‘◇’)ゞ
この記事ではPythonのデータの型の中の「辞書型」について解説します。
まずデータの型についてですが、以下の種類があります。
- 数値型
- 整数
- 浮動小数点
- 複素数
- 文字列
- リスト型
- 辞書型(ハッシュ)
- タプル型
- 集合型
- 論理型
これらすべて完璧に使い方を覚える必要はないと思いますので、この記事では「これくらいは覚えておこう」というものをまとめておきます。
その中でも本記事では「辞書型」について解説します。
基本的なことをまとめておきました。
- Pythonの辞書型とは?
- 辞書の要素を取り出す
- 要素の追加・削除・更新
- その他使う関数やメソッド
こちらの本がPython初心者が挫折することなく勉強できる本です。
(本記事のようのPython使用環境と異なりますが、とてもわかりやすいので全く問題ありません)
辞書型とは?
数値型や文字列はそれ自体でひとつのデータ(値)でしたが、リスト型と同じように辞書型は複数のデータをひとまとまりに扱うことができます。
まずは、辞書型の書き方から確認しましょう。
【ポイント】
- 辞書型は{}で囲み、データを「,(カンマ)」で区切る。
- 「キー(key)」と「値(value)」のペアを要素にして管理する。
実際にGoogle Colabを起動してPythonコードを書いてみます。
1 2 3 4 5 6 7 | data = { 'name':'kamakiri', 'age':32, 'sex':'male' } print(data,type(data)) |
コードの見やすさのため、各要素は改行して書いておく方が良いですね。
ついでにデータの型も見ておきます。
【結果】
1 | {'name': 'kamakiri', 'age': 32, 'sex': 'male'} <class 'dict'> |
このように辞書型は「キーと値」をペアにして要素を管理できるデータ型です。
データの型は、「dict」と出力されているので辞書型であることがわかります。
では、各要素を取り出すにはどのようにするを解説します。
辞書の要素を取り出す
次に、用意した辞書型の各要素を取り出す方法について解説します。
【ポイント】
- 辞書のキー(key)を指定して値(value)要素を取り出す
- 辞書のインデックス(Index)は0からはじまる
辞書の要素を取り出すには、以下のように書きます。
1 | 辞書[キー] |
では、実際にコードを書いてみましょう。
1 2 3 4 5 6 7 8 9 10 | data = { 'name':'kamakiri', 'age':32, 'sex':'male' } print(data['name']) print(data['age']) print(data['sex']) |
【結果】
1 2 3 | kamakiri 32 male |
このように、辞書型にすでに登録されている「キー」を指定すると、そのペアである「値」を取り出すことができます。
次に、各要素の「キー」や「値」を別々に取り出したい場合について以下で確認します。
以下のようにコードを書いて出力を確認します。
1 2 3 | print(data.keys(), type(data.keys())) print(data.values(), type(data.values())) print(data.items(), type(data.items())) |
【結果】
1 2 3 | dict_keys(['name', 'age', 'sex']) <class 'dict_keys'> dict_values(['kamakiri', 32, 'male']) <class 'dict_values'> dict_items([('name', 'kamakiri'), ('age', 32), ('sex', 'male')]) <class 'dict_items'> |
ついでに型も確認しておきました。
- .keys()メソッド:各要素のキーを出力
- .values()メソッド:各要素の値を出力
- .items()メソッド:各要素を出力
このようになっているのがわかるので、
- keys()メソッド:各要素のキーを出力
「キー」のみを出力する場合は、以下のようにfor文を書いてリストの中に「キー」のみを代入する方法を取ればよいです。
1 2 3 4 5 6 7 8 9 10 11 | #キーのみを取り出す data = { 'name':'kamakiri', 'age':32, 'sex':'male' } list = [x for x in data.keys()] print(list) |
【結果】
1 | ['name', 'age', 'sex'] |
👆これで、辞書型の「キー」のみが格納されたリストを作ることができました。
- values()メソッド:各要素の値を出力
同様の方法で、
「値」のみを出力する場合は、以下のようにfor文を書いてリストの中に「値」のみを代入する方法を取ればよいです。
1 2 3 4 5 6 7 8 9 10 11 | #値のみを取り出す data = { 'name':'kamakiri', 'age':32, 'sex':'male' } list = [x for x in data.values()] print(list) |
【結果】
1 | ['kamakiri', 32, 'male'] |
👆これで、辞書型の「値」のみが格納されたリストを作ることができました。
- items()メソッド:各要素を出力
応用として、以下のように「.item()メソッド」を使って、辞書型の各要素をリストに代入して、「リストの要素の取り出し」で学んだ方法で、自由に辞書型の要素を取り出してもいいですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 | data = { 'name':'kamakiri', 'age':32, 'sex':'male' } list = [x for x in data.items()] print(list, type(list)) print(list[0],type(list)) print(list[0][1],type(list[0][1])) |
※要素の型も確認しておきます。
【結果】
1 2 3 | [('name', 'kamakiri'), ('age', 32), ('sex', 'male')] <class 'list'> ('name', 'kamakiri') <class 'list'> kamakiri <class 'str'> |
要素の追加・削除・更新
以下に、ポイントをまとめておきます。
【ポイント】
- 辞書に要素を追加
- 辞書の要素を削除➡del
- 辞書の要素の更新
ひとつひとつ確認しましょう。
辞書に要素を追加
辞書に要素を追加する方法はとても簡単です。
変数に「キー」を設定して、値を代入するだけです。
1 | 変数['キー'] = 値 |
では、実際にコードを書いてみましょう。
1 2 3 4 5 6 7 8 9 | data = { 'name':'kamakiri', 'age':32, 'sex':'male' } data['体重(kg)'] = 78 print(data) |
【結果】
1 | {'name': 'kamakiri', 'age': 32, 'sex': 'male', '体重(kg)': 78} |
このように「キー➡体重(kg)」「値➡78」というペアが追加されたのがわかります。
※Pythonの辞書型はプログラムを実行するタイミングによって要素の並び順が変わってしまうため、並び順を保持したい場合は「OrderedDictオブジェクト」を使う必要がありました。
しかし、(2018.7更新)Python3.7以降で辞書型の並び順が保持されるようになりました。(公式ドキュメント)
辞書の要素を削除➡del
要素を削除したい場合は以下のようにします。
1 | del 辞書[削除するキー] |
実際にコードを書いてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #要素を削除 data = { 'name':'kamakiri', 'age':32, 'sex':'male' } #要素の追加 data['体重(kg)'] = 78 print(data) #要素の削除 del data['name'] print(data) |
【結果】
1 2 | {'name': 'kamakiri', 'age': 32, 'sex': 'male', '体重(kg)': 78} {'age': 32, 'sex': 'male', '体重(kg)': 78} |
最後から2行目で、「del data[‘name’]」として「name」をキーに持つ要素を削除しています。
辞書の要素の更新
1 2 3 4 5 6 7 8 9 10 11 | data = { 'name':'kamakiri', 'age':32, 'sex':'male' } print(data) data['name'] = 'kamakakiri_100' print(data) |
【結果】
1 2 | {'name': 'kamakiri', 'age': 32, 'sex': 'male'} {'name': 'kamakakiri_100', 'age': 32, 'sex': 'male'} |
このように「’name’」のキーに対応する値が「’kamakiri’」から「’kamakakiri_100’」に変わっているのがわかります。
その他使う関数やメソッド
その他に、使うことがあるメソッドを紹介します。
【ポイント】
- 辞書の値にリストを格納する
- 2要素のリストを辞書型に変換する➡dict()関数
- 辞書の要素をコピーする➡copy()メソッド
では、ひとつひとつ見ていきましょう。
辞書の値にリストを格納する
辞書にリストを格納することもできます。
まず、キーに対応する値を以下のようにリストにすることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | #辞書の値にリストを追加する data = { 'name':['kamakiri_1','kamakiri_2'], 'age': [30,31], 'sex':['male','fmale'] } print(data) print(data['name']) #リストの要素を抽出 print(data['name'][0]) |
【結果】
1 2 3 | {'name': ['kamakiri_1', 'kamakiri_2'], 'age': [30, 31], 'sex': ['male', 'fmale']} ['kamakiri_1', 'kamakiri_2'] kamakiri_1 |
リスト内の要素を抽出したい場合は、「data[‘name’]」で値を抽出した後に[0]としてインデックスを指定することで、値の中の要素を抽出することができます。
↓このように書きます。
1 | data[キー][インデックス] |
2要素のリストを辞書型に変換する➡dict()関数
2要素を持つリストを辞書型に変換することもできます。
それには、dict関数を使って2要素のリストを引数にしてやります。
1 | dict(2要素を持つリスト) |
実際にコードを書いてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 | #リストを用意 list = [ ['name','kamakiri_2'], ['age',32], ['sex','male'] ] print(list,type(list)) #リストを辞書に変更 dic = dict(list) print(dic,type(dic)) |
【結果】
1 2 | [['name', 'kamakiri_2'], ['age', 32], ['sex', 'male']] <class 'list'> {'name': 'kamakiri_2', 'age': 32, 'sex': 'male'} <class 'dict'> |
2要素を持つリストが辞書型に変換されているのがわかります。
辞書の要素をコピーする➡copy()メソッド
辞書の要素をコピーする方法は、copy()メソッドを使います。
※ここで、「=]で変数を定義する場合と何が違うのかを明確に理解しておく必要があります。
これは「参照渡し」と「値渡し」の違いを明確に理解しているかどうかが重要になりますので、以下の記事をお読みください<(_ _)>
- 参照渡し:「=」を使って値を代入した場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #参照渡し dic_a = { 'name':'kamakiri', 'age': 32, 'sex':'male' } print('dic_a=', dic_a,type(dic_a), id(dic_a)) print('↓以下で変更を行う') #代入する dic_b = dic_a #nameキーの値を変更 dic_b['name'] = 'apple' print('dic_a=', dic_a,type(dic_a), id(dic_a)) print('dic_b=',dic_b, type(dic_b), id(dic_b)) |
【結果】
1 2 3 4 | dic_a= {'name': 'kamakiri', 'age': 32, 'sex': 'male'} <class 'dict'> 140327617761640 ↓以下で変更を行う dic_a= {'name': 'apple', 'age': 32, 'sex': 'male'} <class 'dict'> 140327617761640 dic_b= {'name': 'apple', 'age': 32, 'sex': 'male'} <class 'dict'> 140327617761640 |
「id」を使ってアドレスを確認してみるとすべて「140327616769696」となっているのがわかります。
これは「dic_b = dic_a」としたときに、「dic_a」のアドレスごと「dic_b」に代入しているのため、「dic_b」の値を変更するということはアドレス内のデータごと変えているということになります。
そのため、「dic_b[‘name’] = ‘apple’」としたときに、「dic_a」には何も操作をしていないのにその後の、print文で「dic_a」のnameキーの値も変更されてしまっているのがわかります。
これを、参照渡しといいます。
- 値渡し:.copy()メソッドを使ってコピーした場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #値渡し dic_a = { 'name':'kamakiri', 'age': 32, 'sex':'male' } print('dic_a=', dic_a,type(dic_a), id(dic_a)) print('↓以下で変更を行う') #代入する dic_b = dic_a.copy() #nameキーの値を変更 dic_b['name'] = 'apple' print('dic_a=', dic_a,type(dic_a), id(dic_a)) print('dic_b=',dic_b, type(dic_b), id(dic_b)) |
【結果】
1 2 3 4 | {'name': 'kamakiri', 'age': 32, 'sex': 'male'} <class 'dict'> 140327616999360 ↓以下で変更を行う {'name': 'kamakiri', 'age': 32, 'sex': 'male'} <class 'dict'> 140327616999360 {'name': 'apple', 'age': 32, 'sex': 'male'} <class 'dict'> 140327616768400 |
先ほどの「参照渡し」での結果と異なるのがわかりますか。
「dic_b[‘name’] = ‘apple’」とした後でも、「dic_a」には一切変更を受けていないのがわかりますね。
これは、「dic_b = dic_a.copy()」としたときに、違うアドレスに「dic_b」が生成されているため、「dic_a」と「dic_b」は全く別のアドレスに値を持つようにできています。
なので、「dic_b」をいくらいじろうとも、「dic_a」には影響しないということになります。
※実際にidによってアドレスを確認すると、「dic_a」と「dic_b」は別のアドレスになっていますよね。
これを値渡しといいます。
まとめ
- 辞書型とは?
- 辞書の要素を取り出す
- 要素の追加・削除・更新
辞書に要素を追加
辞書の要素を削除
辞書の要素の更新 - その他使う関数やメソッド
辞書の値にリストを格納する
2要素のリストを辞書型に変換する?dict()関数
辞書の要素をコピーする➡copy()メソッド
[…] 【Python初心者】辞書型を学ぼう! […]