辞書(dictionary)はPythonの組み込み型の一つで、マッピング型に属します。key:valueペアの集合を{}で囲って生成します。
本記事ではまず、Pythonの辞書の特徴を整理し、その後、項目数やvalueの取得法など辞書の使い方の基本について記載しました。
確認した環境
- OS: Ubuntu 16.04LTS, 20.04LTS
- Python3.9.7
辞書(dictionary)の概要
- Pythonの組み込み型のひとつ、マッピング型に属します。
- Keyでインデックス化されています。(一方、リストは整数型でインデックス化)
- Keyは任意の値が使えますが、ハッシュ可能な値に限られます。(詳細はこちら)
- Keyに対応するValueのペア key:valueの集合を{}で囲って作成できます。(詳細はこちら)
尚、Python3.6までは辞書の順番が保証されていませんでしたが、ver3.7より辞書データの順番が保持されることが仕様化されました。
(参考資料)公式リファレンス:組み込み型 | マッピング型 — dict
(参考記事)[Python] 辞書の要素の順番を保持する(OrderedDict)
keyに使える値は?
辞書につかうkeyは任意の値が使えますが、ハッシュ可能(hashable)な値(※)に限られます。
- リストや辞書等のミュータブル(可変)な型 → keyとして使用不可
- タプルや文字列等のイミュータブル(不可変)な型 → keyとして使用可
※ハッシュ可能(hashable)とは:
(ハッシュ可能) ハッシュ可能 なオブジェクトとは、生存期間中変わらないハッシュ値を持ち (__hash__() メソッドが必要)、他のオブジェクトと比較ができる (__eq__() メソッドが必要) オブジェクトです。同値なハッシュ可能オブジェクトは必ず同じハッシュ値を持つ必要があります。
ハッシュ可能なオブジェクトは辞書のキーや集合のメンバーとして使えます。辞書や集合のデータ構造は内部でハッシュ値を使っているからです。
以下に例を示します。
#keyをタプルで指定
>>> d1 = { ('a', 'b'):1, ('c', 'd'):2 }
>>> d1
{('a', 'b'): 1, ('c', 'd'): 2}
#keyをリストで書こうとするとエラーになります。
>>> d2 = { ['a', 'b']:1, ['c', 'd']:2 }
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
辞書の作り方
辞書データを作成する方法は、以下2つあります。
それぞれの詳細について以下に示します。
key:valueの組み合わせの集合を{}で囲う
辞書は、順序付けされていないkey:valueの組み合わせの集合であり、それらを”{}”で囲うことで作成できます。以下に例を示します。
#key:valueの組み合わせの集合を{}で囲う
>>> d = {'a':1, 'b':2, 'c':3}
>>> d
{'a': 1, 'b': 2, 'c': 3}
#辞書型であることを確認
>>> type(d)
<class 'dict'>
dict()を使って作成する
dict() を使って作成できます。引数は下記3種類を取ることができます。
尚、引数がない場合は空の辞書が作成されます。
- キーワード引数
key = valueという風に(例えばa=1, b=1…)、キーワード引数として与えることが出来ます。
>>> a = dict(a=1, b=2, c=3)
>>> a
{'a': 1, 'b': 2, 'c': 3}
例えばzip() により生成したマッピング オブジェクトから辞書を生成することも出来ます。
>>> d = dict(zip(['a', 'b', 'c'], [1, 2, 3]))
>>> d
{'a': 1, 'b': 2, 'c': 3}
リスト[‘a’, 1]、タプル(’a’, 1)または辞書{’a’:1}など、2つの値を要素に持つイテラブルからも辞書を生成出来ます。
最初の要素がkey、2番めの要素がvalueになります。また、同一のキーが複数存在する場合は、最後の値が反映されます。
#タプルを要素にもつリスト
>>> b1 = dict([('a', 1), ('b', 2), ('c', 3)])
>>> b1
{'a': 1, 'b': 2, 'c': 3}
#リストを要素にもつリスト
>>> b2 = dict([['a', 1], ['b', 2], ['c', 3]])
>>> b2
{'a': 1, 'b': 2, 'c': 3}
#リストを要素にもつタプル
>>> b3 = dict((['a', 1], ['b', 2], ['c', 3]))
>>> b3
{'a': 1, 'b': 2, 'c': 3}
#タプルを要素にもつタプル
>>> b4 = dict((('a', 1), ('b', 2), ('c', 3)))
>>> b4
{'a': 1, 'b': 2, 'c': 3}
#辞書もイテラブルなので引数に取れます
>>> b5 = dict({'a':1, 'b':2, 'c':3})
>>> b5
{'a': 1, 'b': 2, 'c': 3}
辞書の操作いろいろ
項目数を調べる: len(dict)
len(dic)関数を使います。リストの長さを求めるのと同じです。
>>> dic = {'a':1, 'b':2, 'c':3, 'd':4}
>>> len(dic)
4
keyに対応するvalueを取得: dic[key]
[]でキーを指定します。辞書にkeyが存在しなければKeyErrorとなります。
>>> dic = {'a':1, 'b':2, 'c':3, 'd':4}
>>> dic['a']
1
>>> dic['b']
2
>>> dic['e'] # 辞書にkeyが存在しない場合はエラーが発生
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'e'
keyに対応するvalueを取得(エラーを発生させない): dic.get(key)
上記と同じような動作ですが、エラーを発生させないようにするには、dic.get() を使います。
dic.get(key[, default])
keyが辞書に存在すれば、対応するvalueを、存在しなければdefaultを返します。defaultを設定しなかった場合はNoneを返します。
>>> dic = {'a':1, 'b':2, 'c':3, 'd':4}
>>> dic.get('a')
1
# keyが辞書に存在しない場合、Noneを返す
>>> print(dic.get('e'))
None
# defaultを設定した場合
>>> dic.get('e','*')
'*'
辞書にkeyが存在するかどうか確認: key in dic
key in dic または key not in dicで確認できます。
>>> dic = {'a':1, 'b':2, 'c':3, 'd':4}
>>> 'b' in dic
True
>>> 'b' not in dic
False
>>> 'e' in dic
False
>>> 'e' not in dic
True
項目(key:valueペア)、キー、値を取得: dic.items(), keys(), values()
ある辞書データの項目(key:valueペア)、key、valueの集合を取得するにはそれぞれ以下を使います。
- 項目(valueペア) → dic.items()
- キー(key) → dic.keys()
- 値(value) → dic.values()
これらのメソッドは、ビューオブジェクト を返します。この形式は、
- リストと異なり、変更したりappend()で要素を追加することはできません。
- イテレートすることで対応するデータを呼び出すことができるので、forループのなかで使うことができます。
以下に例を記載します。
>>> dic = {'a':1, 'b':2, 'c':3, 'd':4}
#項目(key:valueペア)を取得
>>> dic.items()
dict_items([('a', 1), ('b', 2), ('c', 3), ('d', 4)])
#キー(key)を取得
>>> dic.keys()
dict_keys(['a', 'b', 'c', 'd'])
#キー(value)を取得
>>> dic.values()
dict_values([1, 2, 3, 4])
#ビューオブジェクトはリストと同様にforループで使えます
>>> for k, v in dic.items():
... print(k, v)
...
a 1
b 2
c 3
d 4
辞書の追加や連結、削除
要素の追加や連結、削除については下記をご参照ください。
まとめ
- 辞書データを作成方法は以下2つ
- {}でkey:valueペアをくくる
- dict()コンストラクタを使う
- 辞書のkeyは任意の値を取り得るが、リストや辞書は使えない。タプルは使える。
- 辞書データの項目(key:valueペア)、キー、値を取得するにはそれぞれ以下のメソッドを使う。
- 項目(valueペア)→ dic.items()
- キー(key) → dic.keys()
- 値(value) → values()
コメント
[…] 辞書 (dict) の使い方の基本 | Hibiki Programming Notes […]
[…] 参考記事:【Python】 辞書(dict)の使い方の基本 […]