note.nkmk.me

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

Date: 2018-04-13 / Modified: 2018-06-04 / tags: Python, 辞書
このエントリーをはてなブックマークに追加

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}
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事