Pythonで辞書を作成するdict()と波括弧、辞書内包表記

Pythonで辞書(dict型オブジェクト)を作成するには様々な方法があります。キーkeyと値valueを一つずつ設定するだけでなく、リストから辞書を作成することもできます。 ここでは以下の内容について説明します。

波括弧{}で辞書を作成 dict型のコンストラクタdict()で辞書を作成 キーワード引数で作成 キーと値の組み合わせのリストから作成 キーと値それぞれのリストから作成 別の辞書から作成 辞書内包表記で辞書を作成

辞書の要素の追加・削除・存在確認・取得などについては

波括弧{}で辞書を作成

波括弧{}でキーkeyと値valueの組み合わせを以下のように書くと辞書が生成されます。

{key: value, key: value, ...}

d = {'k1': 1, 'k2': 2, 'k3': 3}
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3}

辞書には同じキーを2つ以上登録できないため、同じキーを指定した場合は上書きされます。

d = {'k1': 1, 'k2': 2, 'k3': 3, 'k3': 300}
print(d)
# {'k1': 1, 'k2': 2, 'k3': 300}

Python3.6時点では辞書が要素の順序を保持するかは実装依存。実装によっては同一キーを指定した場合にどの値が残るかは不定。 以下の例でも同じです。

dict型のコンストラクタdict()で辞書を作成

dict型のコンストラクタdict()で辞書を作成できます。 引数の指定方法はいくつかあります。

キーワード引数で作成

キーワード引数key=valueを指定すると、キーkeyと値valueがそれぞれ登録されます。この場合、キーとして指定できるのは文字列のみ。

d = dict(k1=1, k2=2, k3=3)
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3}

キーと値の組み合わせのリストから作成

キーkeyと値valueの組み合わせ(タプル(key, value)など)のリストでも指定できます。

d = dict([('k1', 1), ('k2', 2), ('k3', 4)])
print(d)
# {'k1': 1, 'k2': 2, 'k3': 4}

上の例はタプルのリストだが、イテラブルであればリストのタプルや集合(set型)のリストなどの組み合わせでも問題ない。

d = dict((['k1', 1], ['k2', 2], ['k3', 4]))
print(d)
# {'k1': 1, 'k2': 2, 'k3': 4}

d = dict([{'k1', 1}, {'k2', 2}, {'k3', 4}])
print(d)
# {1: 'k1', 2: 'k2', 'k3': 4}

集合(set型)については

キーと値それぞれのリストから作成

zip()関数を使うとキーのリストと値のリストから辞書を作成できます。

keys = ['k1', 'k2', 'k3']
values = [1, 2, 3]

d = dict(zip(keys, values))
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3}

zip()関数については

リストの値を処理したり条件によって要素を取捨選択したりしたい場合は後述の辞書内包表記を使います。

別の辞書から作成

コンストラクタdict()の引数に別の辞書オブジェクトを指定すると、その辞書と同じキーと値の生成が作成されます。

d_other = {'k10': 10, 'k100': 100}

d = dict(d_other)
print(d)
# {'k10': 10, 'k100': 100}

元のオブジェクトと生成されたオブジェクトは等価だが、同一オブジェクトではない。

print(d == d_other)
# True

print(d is d_other)
# False

辞書内包表記で辞書を作成

リスト内包表記でリストを作成するのと同様に、辞書内包表記で辞書を作成することもできます。

リスト内包表記との違いは、[]でなく{}で囲むこと、および、キーと値の2つを指定すること。 {キー: 値 for 任意の変数名 in イテラブルオブジェクト}

キーと値には任意の式を指定できます。

l = ['Alice', 'Bob', 'Charlie']

d = {s: len(s) for s in l}
print(d)
# {'Alice': 5, 'Bob': 3, 'Charlie': 7}

キーと値それぞれのリストから作成する場合はコンストラクタdict()と同様にzip()関数を使います。

keys = ['k1', 'k2', 'k3']
values = [1, 2, 3]

d = {k: v for k, v in zip(keys, values)}
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3}

辞書内包表記ではifによる条件分岐もできます。リストをそのまま辞書にするなら上述のようにコンストラクタdict()でいいが、値を処理したり条件によって要素を取捨選択したい場合は辞書内包表記が便利です。

d = {k: v for k, v in zip(keys, values) if v % 2 == 1}
print(d)
# {'k1': 1, 'k3': 3}
Last Updated: 6/26/2019, 10:34:03 PM