sec02 - dictの概要

dictは、keyvalueを紐づけて管理するデータ構造です。dictは"dictionary"の略で、辞書型とも呼ばれています。

スポンサーリンク

Pythonのdict(辞書型)の初期化方法

まずは、最小限のdictの初期化を行ってみましょう。次のようにコードを記述します。

my_profile = {}

変数名と波カッコ{}をイコールで結びます。これが、空のdictです。

dictは必ずしも要素を持っている必要はなく、空のdictを定義した後で、setdefault()メソッドなどを使用して要素を追加することができます。(要素を追加する方法は、専用のレクチャーで詳しく解説します。)

dictは、要素(keyvalueの対)を1組以上持つことができます。次のように、dictの初期化を行うことができます。

# 1行で定義する方法
my_profile = {'name': 'Nico', 'age': 10}

# 要素を改行しながら記述する方法
my_profile = {
    'name': 'Nico',
    'age': 10
}

上記コードは、dictの初期化を行っています。要素はkey: valueのように、コロン(:)でkeyvalueを紐づけます。そして、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の出力順

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の順番は保証されません。)

  1. print()を使用する
    • print()keyの順番で出力されるので、データ量が少ない場合はprint()で確認した方が簡単です
  2. 次のようなコードで出力する
for key in my_profile:
    print(key)

(上記コード例では、dictのkeyの情報を順番に取得して、print出力しています。for文については、専用のレクチャーで解説します。)

スポンサーリンク