java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

Python | 辞書型(dict)を学習し、for文で使ってみた

投稿日:

最終更新日:2021年06月26日

アイキャッチ

こんにちは。

Pythonには辞書型と呼ばれている型があります。これはキーと値を対応付けて管理してくれる型です。型名の正式名称については、Python 3.9.4 documentationではMapping Typesと記載されています。今回はこの型の基本的な使い方を学習し、for文の「in」の個所に記述するリストで使ってみました。この記事は、その時に学んだことの備忘録です。

なお、Pythonを動かしている環境については、以前の記事「WindowsにMinicondaとPyCharm Community Editionをインストールして「Hello World」を出力」に記載してあります。

辞書型の基本的な使い方

Pythonには主要な組み込み型のひとつとして、マッピング型があります。便宜賞、辞書型と呼ぶことにします。今回は、辞書の宣言方法と値の取得方法のサンプルを作ってみました。

宣言方法と値の取得方法

辞書型の簡単な宣言方法は、「キー:値」の組み合わせをカンマ区切りで列挙し、波括弧で囲むことです。

以下のサンプルプログラムでは、最初に辞書型のオブジェクトを定義しています。

ソース

sample_dict = {
    'id': 1,
    'name': 'sample_name_0001'
}

print('key: {0}'.format(sample_dict['id']))

key = 'name'
print('{0}...{1}'.format(key, sample_dict[key]))

今回はキーに文字列を使うことにしました。キーに指定できない型もありますが、文字列は指定できます。実行結果は以下のようになります。

結果

key: 1
name...sample_name_0001

最初の行では辞書型オブジェクトを宣言しています。以下の組み合わせを持つ辞書型オブジェクトが変数sample_dictに格納されます。

キー
id 1
name sample_name_0001

キーに対応する値を取得するには、いくつか方法があります。上記では、角括弧(ブラケット)でキーを指定する方法を使っています。最初のprint文では、キー’id’を指定して、値を出力しています。変数をキーとして使うこともできます。上記の2番目のprint文では、変数keyの文字列を格納し、辞書型オブジェクトsample_dictのキーに指定します。

角括弧(ブラケット)を使う方法では、存在しないキーを指定した場合、エラーが発生します。

以下はエラーが発生するサンプルです。

ソース

sample_dict = {
    'id': 1,
    'name': 'sample_name_0001'
}

print(sample_dict['abc'])

結果

Traceback (most recent call last):
  File "...A002.py", line 3, in <module>
    print(sample_dict['abc'])
KeyError: 'abc'

上記では、sample_dictにはキーabcは定義していないのでKeyErrorが発生します。

get()メソッド

辞書型にはget()メソッドが定義されています。書式は以下です。

get(key[, default])

引数defaultを与えるかどうかで、以下のように少し変わります。

引数defaultを与えない場合
  • keyが辞書型オブジェクトに存在すれば、対応する値を返却する。
  • それ以外の場合、Noneを返却する。
引数defaultを与えた場合
  • keyが辞書型オブジェクトに存在すれば、対応する値を返却する。
  • それ以外の場合、defaultを返却する。

引数defaultを与えたかどうかによらず、引数keyが辞書型オブジェクトに存在する場合は、keyに対応する値が返却されます。

以下はget()メソッドを使ったサンプルです。

ソース

sample_dict = {
    'id': 1,
    'name': 'sample_name_0001'
}

print(sample_dict.get('abc'))

print(sample_dict.get('abc', 'not found'))

実行結果は以下です。

結果

None
not found

上記の2つのprintでは文ではキー ‘abc’を指定していますが、対象の辞書型オブジェクトにそのキーは存在しません。最初のprint文では、引数defaultを与えていないため、Noneが返却されました。2番目のprint文では、引数defaultを与えています。その文字列が返却されています。

for文で使う

for文の構文は以下のようになっています。

for 変数 in [リスト]:
	繰り返したい処理 1
	繰り返したい処理 2
	・
	・
	・

以前の記事「for文とwhile文を学習した」ではリストに辞書型を使いませんでした。今回は辞書型をリスト式で使うためのメソッドを紹介します。

辞書型オブジェクトの値をfor文に使うには、以下の3つのメソッドが用意されています。

keys()
キーで構成されてるオブジェクトが返却される。
values()
値で構成されてるオブジェクトが返却される。
items()
キーと値の組で構成されてるオブジェクトが返却される。

返却されるオブジェクトのクラス名については、以下のサンプルで確かめてみました。

ソース

sample_dict = {
    'id': 1,
    'name': 'sample_name_0001'
}

v = sample_dict.keys()
print(type(v))
print(v)

print('----------------------------------')

v = sample_dict.values()
print(type(v))
print(v)

print('----------------------------------')

v = sample_dict.items()
print(type(v))
print(v)

結果

<class 'dict_keys'>
dict_keys(['id', 'name'])
----------------------------------
<class 'dict_values'>
dict_values([1, 'sample_name_0001'])
----------------------------------
<class 'dict_items'>
dict_items([('id', 1), ('name', 'sample_name_0001')])

クラス名は上記のとおりですが、Python 3.9.4 Documentationによると、上記の3つのメソッドで返却されるオブジェクトはビューオブジェクトと呼ばれるオブジェクトです。これらのオブジェクトはfor文の[リスト]に指定することができます。

以下はkeys()とvalues()を使った簡単なプログラムです。

ソース

sample_dict = {
    'id': 1,
    'name': 'sample_name_0001'
}

for key in sample_dict.keys():
    print(key)

print('----------------------------------')

for value in sample_dict.values():
    print(value)

単純にfor文に指定した変数を出力しているだけです。実行結果は以下です。

結果

id
name
----------------------------------
1
sample_name_0001

出力結果を見ると、それぞれのfor文で、キーと値が変数に格納されているのがわかります。

items()メソッドをfor文で使う場合は、以下のように変数を2つ記述します。

ソース

sample_dict = {
    'id': 1,
    'name': 'sample_name_0001'
}

print('{0:>5}:{1:>20}'.format('key', 'value'))
for key, value in sample_dict.items():
    print('{0:>5}:{1:>20}'.format(key, value))

結果

  key:               value
   id:                   1
 name:    sample_name_0001

上記のようにfor文にカンマ区切りで2つ変数を指定すると、それぞれにキーと値が格納されます。

何故このような書き方ができるのか、細かい文法までは今回は調べきれませんでした。ただ、Pythonにはアンパック代入というものがあり、そのルールが適用されているのだと思います。

以下はサンプルでは、items()メソッドの結果をlist型にして、最初の要素をアンパック代入で変数keyと変数valueに代入しています。

ソース

sample_dict = {
    'id': 1,
    'name': 'sample_name_0001'
}

items_list = list(sample_dict.items())
print(f'{items_list=}')

print('----------------------------------')

item = items_list[0]
print(type(item))
print(f'{item=}')

print('----------------------------------')

key, value = item
print(f'{key=}, {value=}')

結果

items_list=[('id', 1), ('name', 'sample_name_0001')]
----------------------------------
<class 'tuple'>
item=('id', 1)
----------------------------------
key='id', value=1

上記で使っているtype()関数は型名を出力してくれます。変数itemにリストの最初の要素を格納し、型名を出力しています。型名がtupleと出力されていますが、これは簡単に言うと変更不可能なリストです。

最後の代入式の左辺ではkeyとvalueを記述し、右辺にはタプル型を記述しています。このように書くと左から順に値を格納してくれます。先ほどのfor文でも同じようなことが適用されているようです。

とにかく、辞書型のキーと値をfor文で使いたい場合は上記のような書き方ができることを覚えておけばよいと思います。

以上、参考になれば幸いです。