Pythonで辞書を作成するには幾つかの方法がある。それらの方法と辞書を作成する際に注意する点を紹介する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
# 波かっこを使う
d = {} # 空の辞書
print(d) # {}
d = {'key0': 0, 'key1': 1}
print(d) # {'key0': 1, 'key1': 1}
# キーにはハッシュ可能なオブジェクトとしなければならない
key = [0, 1, 2] # リストはハッシュ不可能
value = 102
d = {key: value} # TypeError
key = (0, 1, 2) # このタプルはハッシュ可能
d = {key: value} # OK
print(d) # {(0, 1, 2): 102}
key = ([0, 1, 2], 3, 4) # このタプルはハッシュ不可能
d = {key: value} # TypeError
# dict関数を使う
d = dict() # 空の辞書
print(d) # {}
# dict関数にキーワード引数を指定する
d = dict(key0=0, key1=1)
print(d) # {'key0': 0, 'key1': 1}
# Pythonのマッピング型(辞書的なオブジェクト)を指定する
d2 = dict({'value2': 2, 'value3': 3})
print(d2) # {'value2': 2, 'value3': 3}
# dict関数に2要素の反復可能オブジェクトを要素とする反復可能オブジェクトを渡す
l0 = ['key0', 0]
t0 = ('key1', 1)
l1 = [l0, t0]
print(l1) # [['key0', 0], ('key1', 1)]
d = dict(l1)
print(d) # {'key0': 0, 'key1': 1}
# 内包表記を使う方法
d = {f'key{x}': x for x in range(2)}
print(d) # {'key0': 0, 'key1': 1}
Pythonにおける辞書とは「キー」と「値」の組を0個以上含むオブジェクトのことで、その要素(キーと値の組)は「{キー: 値}」のようにキーとそのキーに対応する値をコロンで区切ったものを波かっこ「{}」で囲んで表現される。
辞書を作成するには幾つかの方法がある。
以下ではこれらの方法を紹介する。
波かっこ「{}」を使って辞書を作成するには、キーと値の組をコロンで区切ったものを0個以上波かっこの中に記述する。キーと値の組が複数あるときには、それらをカンマで区切る。
以下に例を示す。
d = {} # 空の辞書
print(d) # {}
d = {'key0': 0, 'key1': 1}
print(d) # {'key0': 1, 'key1': 1}
最初の例は波かっこのみで、キーと値の組がない。この場合は要素(キーと値の組)を持たない空の辞書が作成される。
次の例では、'key0'という文字列キーとその値「0」、'key1'という文字列キーとその値「1」を格納する辞書を作成している。
注意が必要なのは、辞書のキーはハッシュ可能でなければならないことだ。文字列や数値はハッシュ可能だが、リストや集合はハッシュ可能ではない(要素が変更されることのないfrozensetはハッシュ可能)。タプルはその要素を変更できないが、タプルの要素の要素が変更可能な場合にはハッシュ可能ではない(リストを格納するタプルはハッシュ不可能)。
以下に例を示す。
key = [0, 1, 2] # リストはハッシュ不可能
value = 102
d = {key: value} # TypeError
この例では、整数を要素とするリストをキーとして辞書を作成しようとしている。しかし、リストはハッシュ可能ではないので、これをキーとすることはできない。そのため、辞書を作成しようとしたところでTypeError例外が発生する。
一方、以下の例では整数を要素とするタプルをキーにしようとしている。
key = (0, 1, 2) # このタプルはハッシュ可能
d = {key: value} # OK
print(d) # {(0, 1, 2): 102}
整数はハッシュ可能であり、これを要素とするタプルもハッシュ可能なので、これはキーとして使用できる。そのため、問題なく辞書を作成できる。
ハッシュ可能でないリストを要素とするタプルをキーにしようとするとどうなるだろう。
key = ([0, 1, 2], 3, 4) # このタプルはハッシュ不可能
d = {key: value} # TypeError
この場合は、やはり、辞書を作成しようとしたところでTypeError例外が発生する。
dict関数を使う場合には、引数の渡し方として、以下のように幾つかの方法がある。
最後の方法は文にすると分かりにくいがコードを見ればその意味が分かるはずだ。以下ではこれらを順番に見ていこう。
d = dict() # 空の辞書
print(d) # {}
引数を指定しないでdict関数を呼び出したときには空の辞書が作成される。これは「d = {}」のように波かっこのみを使って辞書を作成した場合と同じだ。
キーワード引数を使って「キー=値」のように引数を指定した場合の例を以下に示す。
d = dict(key0=0, key1=1)
print(d) # {'key0': 0, 'key1': 1}
この場合、キーワード引数「key0=0」の「key0」の部分が文字列キーとなり、「0」のようにキーワード引数の値として指定したものがその値となる。
マッピングオブジェクトを指定する例を以下に示す。
d2 = dict({'value2': 2, 'value3': 3})
print(d2) # {'value2': 2, 'value3': 3}
この例では、マッピングオブジェクトとして辞書を指定している。この場合は、指定したマッピングオブジェクトと同じ要素(キーと値の組)を持つ辞書が作成される。
要素を2つ持つ反復可能オブジェクトを要素とする反復可能オブジェクトを渡すと書くと、分かりにくいが以下のような反復可能オブジェクトを渡すと考えればよい。
[[キー0, 値0], (キー1, 値1), {キー2, 値2}, ……]
外側の反復可能オブジェクトの要素がリスト、タプル、集合になっている点に注目しよう。反復可能オブジェクトであれば、何でもよい(外側の反復可能オブジェクトもリストである必要はない)。
このような反復可能オブジェクトからdict関数は次のような辞書を作成してくれる。
{キー0: 値0, キー1: 値1, キー2: 値2, ……}
以下に例を示す。
l0 = ['key0', 0]
t0 = ('key1', 1)
l1 = [l0, t0]
print(l1) # [['key0', 0], ('key1', 1)]
d = dict(l1)
print(d) # {'key0': 0, 'key1': 1}
この場合は、l0とt0はどちらも2つの要素を持つ反復可能オブジェクト(リストとタプル)である。l1はこれらを要素とする反復可能オブジェクト(リスト)になっている。そして、これをdict関数に渡すと、l1(外側の反復可能オブジェクト)の要素を反復して、l0とt0が順に取り出され、1つ目の要素(l0なら'key0'、t0なら'key1')がキーとして、2つ目の要素(l0なら0、t0なら1)がそのキーに対応する値として辞書が作成される。
内側の反復可能オブジェクトに辞書を含める場合には注意が必要だ。
d = dict([{'key0': 0, 'key1': 1}])
print(d) # {'key0': 'key1'}
キーと値の組で辞書の1つの要素となり、単純に上のように書くとキーの部分だけが取り出されてしまう。
マッピングオブジェクトとキーワード引数を混在させることや(dict({'key0': 0}, key1=1))、反復可能オブジェクトとキーワード引数を混在させること(dict([('key0', 0)], key1=1))も可能だが、マッピングオブジェクトと反復可能オブジェクトの両方(とキーワード引数)を一度に渡すこと(dict([('key0', 0)], {'key1': 1}, key2=2))はできない。また、混在させるときにはキーワード引数をマッピングオブジェクトまたは反復可能オブジェクトの後に置く必要がある。
辞書の内包表記は次のような形式で記述する。
{キーを算出する式: 値を算出する式 for 変数 in 反復可能オブジェクト}
「キーを算出する式」と「値を算出する式」では、「反復可能オブジェクト」から取り出した値を代入する「変数」の値を使用することになるだろう。以下に例を示す。
d = {f'key{x}': x for x in range(2)}
print(d) # {'key0': 0, 'key1': 1}
この例では「キーを算出する式」がf文字列「f'key{x}'」に、「値を算出する式」は「x」になっている。「変数」である「x」には「反復可能オブジェクト」である「range(2)」から順に値(0、1)が代入され、その値を使って「'key0': 0」「'key1': 1」という要素を持つ辞書が作成されている。
Copyright© Digital Advantage Corp. All Rights Reserved.