
dictは、keyとvalueを紐づけて管理するデータ構造です。dictは"dictionary"の略で、辞書型とも呼ばれています。
Table of Contents(目次)
Pythonのdict(辞書型)の初期化方法
まずは、最小限のdictの初期化を行ってみましょう。次のようにコードを記述します。
my_profile = {}
変数名と波カッコ{}
をイコールで結びます。これが、空のdictです。
dictは必ずしも要素を持っている必要はなく、空のdictを定義した後で、setdefault()
メソッドなどを使用して要素を追加することができます。(要素を追加する方法は、専用のレクチャーで詳しく解説します。)
dictは、要素(keyとvalueの対)を1組以上持つことができます。次のように、dictの初期化を行うことができます。
# 1行で定義する方法
my_profile = {'name': 'Nico', 'age': 10}
# 要素を改行しながら記述する方法
my_profile = {
'name': 'Nico',
'age': 10
}
上記コードは、dictの初期化を行っています。要素はkey: value
のように、コロン(:
)でkeyとvalueを紐づけます。そして、key: value
の要素が複数ある時は、カンマ(,
)で区切りながら記述します。
Pythonのdictで使えるkeyとvalueのデータ型
keyは文字列だけではなく、数値やtupleなど、そのデータ自身が編集できないものであれば使用することができます。例えば、1: 'one'
や(1,): 'num_tuple'
のような要素を加えることができます。listのように要素を編集できてしまうデータ型をkeyに使用することはできません。
また、1つのdictのデータの中に、同じkeyを複数持たせることはできません。必ず一意の値にする必要があります。
key_sample = {
1: 'one',
(1,): 'num_tuple',
'1': 'num_str'
}
文字列以外のデータ型もkeyにすることができますが、多くの場合、文字列をkeyに使用することになります。というのも、valueがどのようなデータなのかを文字列で説明するようにkeyを設定しておくことで、開発やデバッグ時に役立つからです。
尚、valueに設定できるデータ型については制限はありません。数値・文字列・list・dictなど、どのようなデータ型でもvalueに設定できます。
my_profile = {
'name': 'Nico',
'age': 10,
'languages': ['Python', 'Java', 'C', 'C++'],
'friends': [
{
'name': 'Emma',
'age': 9
},
{
'name': 'Jack',
'age': 11
}
]
}
Pythonのdictにおけるkey順序の仕様と注意点
dictのkeyの順番は、最初に定義された時や、要素が追加された順番で管理されます。しかし、Python3.7より前のバージョンでは、dictのkeyの順番は保証されないので注意が必要です。
(仕事などでPython3.7よりも前のバージョンで開発を行う必要があるときは、dictのkeyの順番は保証されない前提でコードを書く必要があります。)
Pythonのdictから要素を取り出す方法
dictの要素は、var[key]
のように記述します。先ほどの"my_profile"変数の要素を取り出してみましょう。
my_profile = {
'name': 'Nico',
'age': 10,
'languages': ['Python', 'Java', 'C', 'C++'],
'friends': [
{
'name': 'Emma',
'age': 9
},
{
'name': 'Jack',
'age': 11
}
]
}
print(my_profile['name']) # Nico
print(my_profile['age']) # 10
print(my_profile['languages']) # ['Python', 'Java', 'C', 'C++']
print(my_profile['friends']) # [{'name': 'Emma', 'age': 9}, {'name': 'Jack', 'age': 11}]
上記コードのように、keyを使って要素を取り出すことができます。
ただし、存在しないkeyを指定してしまうとエラーになります。keyが存在しない時のエラーは、dictのget()
メソッドで回避することができます。取り出したいと思っているデータのkeyをdictが持っているかどうか分からない場面では、var[key]
ではなくvar.get(key)
を使用すると良いでしょう。
(dictのメソッドについては、専用のレクチャーで詳しく解説します。)
Pythonのdictの要素数を取得するlen()の使い方
dictの要素数(keyの数)を確認するには、len()
関数を使用します。
my_profile = {
'name': 'Nico',
'age': 10,
'languages': ['Python', 'Java', 'C', 'C++'],
'friends': [
{
'name': 'Emma',
'age': 9
},
{
'name': 'Jack',
'age': 11
}
]
}
print(len(my_profile)) # 4
valueにdictやlistのネストがあったとしても、len()
関数が返す値はkeyの数になります。
Pythonのネストされたdict(辞書型)の扱い方
ネストされたdictの情報を取り出すには、listなどと同じように、取り出したいkeyを並べて記述します。例えば、下記コードの"my_friends"の情報から"Jack"の年齢("age")の情報を取り出したい場合は、my_friends['Jack']['age']
のように記述します。
my_friends = {
'Emma': {'age': 9, 'phone': '090-1234-5678'},
'Jack': {'age': 11, 'phone': '080-1234-5678'}
}
print(my_friends['Jack']['age']) # 11
Pythonのpprintでdictを見やすく整形出力する方法
要素が多かったり、ネストしているdictの場合、print()
関数の出力では中身が分かりにくい場合があります。その場合はpprint()
関数を使うことで、視認性がアップします。次の"my_profile"のデータを、print()
で出力した場合と、pprint()
を使用した場合とで比べてみましょう。尚、pprint()
関数を使うには、from pprint import pprint
という"おまじない"を記述する必要があります。(詳しくは"モジュール"のレクチャーで解説します。)
from pprint import pprint
my_profile = {
'name': 'Nico',
'age': 10,
'languages': ['Python', 'Java', 'C', 'C++'],
'friends': [
{
'name': 'Emma',
'age': 9
},
{
'name': 'Jack',
'age': 11
}
]
}
print(my_profile)
pprint(my_profile)
出力結果は次のようになります。
# print の出力例
{'name': 'Nico', 'age': 10, 'languages': ['Python', 'Java', 'C', 'C++'], 'friends': [{'name': 'Emma', 'age': 9}, {'name': 'Jack', 'age': 11}]}
# pprint の出力例
{'age': 10,
'friends': [{'age': 9, 'name': 'Emma'}, {'age': 11, 'name': 'Jack'}],
'languages': ['Python', 'Java', 'C', 'C++'],
'name': 'Nico'}
これくらいの物量であればprint()
でも解析できますが、実際の業務で大量のデータを解析する場合は、1行で出力するprint()
では対応しきれなくなります。pprint()
で出力する方法も覚えておくと、将来的に役立ちます。
pprint()
はdictのデータを出力する時に、デフォルトではkeyをアルファベット順に並び替えて出力します。(これは、出力時に並び替えて表示しているだけで、元データを変更しているわけではありません。)
元データが管理しているkeyの順番で出力したい場合は、sort_dicts=False
というオプションを加えます。次のように記述すると、dictが管理している情報をそのまま出力することができます。
pprint(my_profile, sort_dicts=False)
pprint()
のsort_dicts=False
オプションを使えるのはPython3.8以降のバージョンに限られます。3.8よりも前のバージョンでkeyの順番を確認したい場合は、次の2つの方法があります。 (※ いずれの場合も、Python3.7よりも前のバージョンでは、dictのkeyの順番は保証されません。)
print()
を使用するprint()
はkeyの順番で出力されるので、データ量が少ない場合はprint()
で確認した方が簡単です
- 次のようなコードで出力する
for key in my_profile:
print(key)
(上記コード例では、dictのkeyの情報を順番に取得して、print出力しています。for文については、専用のレクチャーで解説します。)