note.nkmk.me

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

Date: 2018-04-13 / Modified: 2019-06-05 / tags: Python, 辞書

Pythonで辞書(dict型オブジェクト)を作成するには様々な方法がある。キーkeyと値valueを一つずつ設定するだけでなく、リストから辞書を作成することも可能。

ここでは以下の内容について説明する。

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

辞書の要素の追加・削除・存在確認・取得などについては以下の記事を参照。

スポンサーリンク

波括弧{}で辞書を作成

キーと値を個別に指定

波括弧{}でキーkeyと値valueの組み合わせを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.5から{**d1, **d2}という書き方ができるようになった。

以下のように、2つの辞書を結合して新たな辞書を生成できる。元の辞書は更新されない。

d1 = {'k1': 1, 'k2': 2}
d2 = {'k3': 3, 'k4': 4}

d = {**d1, **d2}
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}

print(d1)
# {'k1': 1, 'k2': 2}

print(d2)
# {'k3': 3, 'k4': 4}

キーと値を個別に指定するkey: valueの書き方と組み合わせることも可能。

print({**d1, **d2, 'k5': 5})
# {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4, 'k5': 5}

3つ以上の辞書でもOK。

d3 = {'k5': 5, 'k6': 6}

print({**d1, **d2, **d3})
# {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4, 'k5': 5, 'k6': 6}

同じキーを指定した場合は上書きされる。

d4 = {'k1': 100, 'k3': 300}

print({**d1, **d2, **d3, **d4, 'k5': 500})
# {'k1': 100, 'k2': 2, 'k3': 300, 'k4': 4, 'k5': 500, 'k6': 6}

Python3.5より前のバージョンでは上の書き方はできない。複数の辞書から新たな辞書を生成したい場合は後述のdict(**d1, **d2)を使う。

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()関数を使うとキーのリストと値のリストから辞書を作成できる。リストに限らず、タプルなどでもOK。

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

dict()の引数に複数の辞書をそのまま指定するとエラー。

# d = dict(d1, d2)
# TypeError: dict expected at most 1 arguments, got 2

上述のように、dict()ではキーワード引数(key=value)として要素を指定できるので、辞書に**をつけてそれぞれの要素をキーワード引数として展開して渡せばOK。

d = dict(**d1, **d2)
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}

また、上述のように、Python3.5からは{**d1, **d2}といった書き方も可能。

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

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

リスト内包表記との違いは、[]でなく{}で囲むこと、および、キーと値の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}
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事