[Python入門]辞書Python入門(1/4 ページ)

Pythonには「キーと値」の組を管理するためのデータ構造として「辞書」がある。その基本的な使い方とリストやタプルとの違いなどについて触れる。

» 2023年10月16日 05時00分 公開
[かわさきしんじDeepInsider編集部]
「Python入門」のインデックス

連載目次

* 本稿は2019年6月19日、2022年7月1日に公開/改訂された記事を、Python 3.12.0で動作確認したものです(確認日:2023年10月16日)。


辞書とは

 Pythonにおける「辞書」というのは、「キー」と「値」の組で表されるデータ(本稿ではこれを「項目」と呼ぶ)を複数格納可能なデータのこと。例えば、英和辞書で英単語を引くことを想像してみよう。辞書から何かの単語の意味を見つけるときには、アルファベット順に並べられた項目の中から、その単語の「綴り」を探す。その語が辞書に掲載されていれば、無事にその項目が見つかって、その意味を取り出せる(なければ、別の辞書を使うか、インターネットで単語を検索することになるだろう)。

 Python(や他のプログラミング言語)における「辞書」はそれと似た、検索に使う「キー」と、そのキーに関連付けられた「値」を格納するデータ構造である。通常の辞書で検索に使う「綴り」が「キー」に、その綴りで得られる「項目」が「値」に相当する。なお、「辞書」ではなく「連想配列」(associative array)と呼ぶこともある。また、辞書のように、「何らかの値を、別の値に対応付ける(マッピング)する」データ構造のことを、Pythonでは「マッピング型」と総称することもある(辞書はマッピング型に含まれるデータ型の一つである)。

辞書 辞書

辞書の定義

 Pythonでは辞書は波かっこ「{}」で囲んで表現する。その中には、今述べた「キー」と「値」の組を、「キー: 値」のようにしてコロンでつなぎ、キーと値の組が複数あれば、それらをカンマで区切って並べていく。

Pythonの辞書 Pythonの辞書

 キーには、文字列や整数値などを指定できる(ただし、リストはキーには使えない。理由は後述)。値には整数でも実数(浮動小数点数)でも、リストでも、文字列でも何でも指定できる。

 辞書を作成するには、今述べたように「波かっこの中に、キーと値の組をカンマ区切りで並べて」いけばよい。以下に実際に辞書を定義する例を示す。

sk = {'first_name': 'shinji', 'family_name': 'kawasaki', 'weight': 80}
print(sk)

辞書の定義

 これは前回で作成した「名前と名字、体重」を格納するタプルを辞書で表現し、各要素に名前(キー)を付けたものと考えられる。実行結果を以下に示す。

実行結果 実行結果

 なお、1つの辞書の中でキーが重複することはない。言い換えると、1つの辞書の中であるキーに対応付けられる値は1つだけだ。以下に例を示す。

sk = {'first_name': 'shinji', 'family_name': 'kawasaki', 'weight': 80,
      'family_name': 'okazaki'}
print(sk)

キー'family_name'を重複して指定

 この場合には、一方の値でもう一方の値が書き換えられてしまう。上のコード例では、'family_name'というキーを複数記述しているが、以下に示すように実際に保存されるキーと値の対は1つだけとなる。

1つの辞書には同じキーに関連付けられる値は1つだけしか保存できない 1つの辞書には同じキーに関連付けられる値は1つだけしか保存できない

非明示的な行継続

 上のコードを見て、違和感を覚えた方がいるかもしれない。第18回「リストと繰り返し処理」のコラム「明示的な行継続」では「行が長くなるときには、バックスラッシュを使って途中で改行してもよい」と述べた。だが、上のコードでは辞書を定義する行の途中でバックスラッシュを使うことなく改行をしている。

sk = {'first_name': 'shinji', 'family_name': 'kawasaki', 'weight': 80,  # 改行
      'family_name': 'okazaki'}

バックスラッシュを使っていないのに行の途中で改行されている

 実はPythonでは、かっこ「()」、角かっこ「[]」、波かっこ「{}」に囲まれた範囲内ではバックスラッシュを使わずに改行を入れて、行を分割できる。これを「非明示的な行継続」と呼ぶ。先ほどのコードは、辞書を定義する波かっこ「{}」内でカンマの後に改行を入れていたので、非明示的な行継続となっている。

 また、非明示的な行継続を行っているときには、インデントを自由に設定できるので、上のコードでは、空白文字を先頭に入れてキーの始まる位置をそろえ、コードが見やすくなるようにしている。


 空の辞書を作成するには、単に波かっこ「{}」だけを書けばよい。

emptydict = {}
print(emptydict)

空の辞書の作成

 これにより、空の辞書が作成される。空の辞書には、後述する操作を行うことで、キーと値の組を追加できる。

dict関数による辞書の作成

 リストのlist関数やタプルのtuple関数のように、辞書もdict関数を使って作成可能だ。

dict関数

dict(**kwarg)
dict(mapping, **kwarg)
dict(iterable, **kwarg)


 先頭の形式(**kwarg)は引数に「キーワード=値」形式のキーワード引数を指定する(例:dict(key0=0, key1=1)。この場合、「キーワード」を辞書のキーとして、「値」をそのキーワードの値とする辞書を作成する(先の例であれば、'key0'という文字列のキーと対応する整数値の0の組、'key1'というキーと1という値の組の2つの組が辞書に登録される)。mappingに辞書オブジェクトなどを指定した場合、それと同じキーと値の組を持つ辞書が作成される(例:dict({'key0': 0, 'key1': 1}))。iterableを渡す場合には、その各要素が2つの要素を持つ必要がある(例:dict([('key0', 0), ('key1', 1)])。各要素の最初の要素がキーに、次の要素が値となる。なお、引数は全て省略可能で、省略した場合は空の辞書が作成される。

パラメーター 説明
**kwarg 「キーワード=値」形式のキーワード引数。キーワード引数は任意の数だけ指定可能。mappingやiterableと同時に、**kwargを指定する場合には、キーワード引数を後に指定する
mapping 辞書などの「キーと値の組」を持つマッピング型のオブジェクト
iterable 要素を2つだけ持つ反復可能オブジェクトを格納する反復可能オブジェクト
dict関数のパラメーター


 以下にdict関数による辞書の作成の例を示す。

mydict = dict()  # 空の辞書の作成
print(mydict)
mydict = dict(foo='foo', bar='bar'# キーワード引数による辞書作成
print(mydict)
mydict = dict({'foo': 'FOO', 'bar': 'BAR'})  # 辞書を基にした辞書作成
print(mydict)
mydict = dict([('foo', 1), ['bar', 2]])  # 反復可能オブジェクトを使った辞書作成
print(mydict)
mydict = dict({'foo': 'FOO', 'bar': 'BAR'}, baz='baz'# 組み合わせ
print(mydict)

dict関数の使用例

 以下に実行結果を示す。

実行結果 実行結果

 最初のdict関数呼び出しでは、引数を渡していない。この場合には、空の辞書が作成される。次のdict関数呼び出しでは、キーワード引数(**kwarg)を指定して辞書を作成している。キーワード引数に指定した「キーワード」は文字列キーとなることには注意しよう(キーワード引数のキーワードには整数値は指定できない)。

 3番目の呼び出しでは、dict関数に「{'foo': 'FOO', 'bar': 'BAR'}」という辞書を渡している。この形では、基の辞書(マッピング)と同じキーと値の組を持つ辞書が作成される。4番目の呼び出しは反復可能オブジェクトを渡す例だ。その要素は「要素を2つだけ持つ反復可能オブジェクトである必要がある」点に注意。上の例では、リストの中に要素を2つ持つタプルとリストを格納している。

 最後の呼び出しは、辞書とキーワード引数の両者を指定した場合の例だ。同様にして、反復可能オブジェクトとキーワード引数も渡せる。ただし、辞書(マッピング)、反復可能オブジェクト、キーワード引数の3種類の値を渡すことはできないので注意しよう。

       1|2|3|4 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。