1|2|3|4辞書の項目の反復処理とkeys/values/itemsメソッドリストやタプルと同様に、for文と辞書を組み合わせることも可能だ。sk:print(item)for文と辞書を組み合わせた例この例ではfor文に反復可能オブジェクトとして辞書をそのまま置いている。このコードを実行すると次のようになる。for文に反復可能オブジェクトとして辞書を渡すとループ変数にはキーが渡されるご覧の通り、この場合には辞書のキーがループ変数に渡される。先ほども述べたように、反復可能オブジェクトとして辞書そのものを使う場合には、そのキーが対象となっている。キーに対応する値を得るには次のようなコードを書けばよい(実行結果は省略)。sk[item])ループ変数に与えられたキーを使って、その値を得るこのようにすれば辞書のキーにもその値にもアクセスできるが、辞書には「ビューオブジェクト」を返送する3つのメソッドが備わっている。これらを使えば、辞書のキー/値/キーと値の両者を手軽に扱える。keysメソッド:辞書に格納されているキーを一覧するビューオブジェクトを返すvaluesメソッド:辞書に格納されている値を一覧するビューオブジェクトを返すitemsメソッド:辞書に格納されているキーと値の組を一覧するビューオブジェクトを返すこれらのうちのitemsメソッドを使って先ほどのコードを書き替えると次のようになる。value)itemsメソッドを使って、キーと値の組をタプルとしてループ変数に受け取るこのコードではitemsメソッドによりキーと値の組をタプルにまとめて反復してくれるオブジェクトを得て、それを使って繰り返し処理を行っている。そのため、キーと値にダイレクトにアクセスできている。itemsメソッドを使うと、キーと値がタプルにまとめられるところで、「ビューオブジェクト」は辞書に格納されているキーや値、あるいはそれらの組を一覧できる動的なビューを提供するもので、今見たように反復可能オブジェクトのように扱える。「動的」というのは、ビューを作成した後に辞書に対して行われた変更がキーに反映されることを意味している(「動的」の反対語は「静的」であり、仮にビューオブジェクトが静的だとしたら、keysメソッドでキーの一覧を取得した後に辞書に新たに項目を追加しても、それが一覧には反映されない)。ビューオブジェクトが動的であることを確認するコードを以下に示す。'bar'print(myview)ビューオブジェクトを作成した後に、辞書に変更を加えるここでは、変数mydictに辞書を代入した後に、keysメソッドを用いて変数myviewにそのビューを取得している。その後、辞書に新たに項目を追加して、その内容を確認している。このコードを実行すると次のようになる。ビューオブジェクトを作成した後に、辞書に変更を加えても、それが反映される最後の出力を見ると、ビューオブジェクトを得た後に辞書に追加した項目のキーも、ビューオブジェクトに含まれているのが分かるはずだ。in演算子でキーの存在確認をする場合、辞書に格納されているキーが対象となるのは既に述べた通りなので、keysメソッドにはそれほどの使い道はないかもしれない。これに対して、辞書に特定の値が格納されているかを確認したいときにはvaluesメソッドが役に立つだろう。valuesメソッドの使用例を以下に示す(実行結果は省略)。Truevaluesメソッドで値の一覧を取得して、そこに文字列'kawasaki'があるかを調べる既に見た通り、itemsメソッドはキーと値の組を一覧するビューオブジェクトを提供するものだ(実行結果は省略)。value)itemsメソッドを使って、キーと値の組をタプルとしてループ変数に受け取る(再掲)繰り返し処理でキーと値の両者が必要になるときには、このメソッドが便利に使えるだろう。辞書の使いどころ前回の「タプルとリストの違い」では、それらの主な用途として次のようなことを挙げた。リストは「同種のデータを複数個並べて管理する」ためのものタプルは「異なる種類だが(あるいは同じ種類で)、関連性のあるデータをひとまとめにする」ためのものこれに対して、辞書は「格納されているデータに名前を付けることで扱いを容易にする」「整数インデックスでは管理が難しいデータを扱う」ためのものと考えられる。前回は名前と名字と体重を管理するためにタプルを使って、次のようなコードを書いていた。80)名前と名字と体重をタプルにまとめたリストでも同様なデータ構造は作成できる。80]名前と名字と体重をリストにまとめたただし、先ほどの主な用途に照らすと、リストはどちらかといえば「同種のデータを並べて管理する」ものなので、あまりこのやり方はなじまない(もちろん、そうすることは自由だ)。タプルは異種データ(同種データでもよい)をひとまとめにして扱うのに便利なので、上のような使い方をするのは普通のことといえる。タプルでは「何番目の要素が何を表すデータ」なのかが不明だ。インデックス0にあるのが名前で、インデックス1にあるのが名字というのはコードを見れば、想像はできるが、それが正しいかは誰も保証してくれない。これに対して、辞書は値に名前(キー)を付加することで、それが何を意味するものなのかを明確にしてくれる。80}名前と名字と体重を辞書にまとめた3つのデータ構造にはこのような違いがある。特定のURLに関するデータ(例えば、筆者、タイトル、ページビューなど)を管理するといった場合にも辞書は便利に使えるだろう。以下はそうしたデータの例だ。1234567}}URLをキーとして、その値(記事名、ページビュー、筆者)を辞書としたデータこれはURLをキーとして、そのURLで示されるページの各種データ(記事名、ページビュー、筆者)をさらに辞書にまとめたものをそのキーの値とした辞書だ。このようなデータがあれば、以下のようにページビュー(値となっている辞書から「'pv'」というキーで得られる値)が一番多いURLを調べるといったことも可能になる。{top_article_url}')PVが一番多い記事を調べるコード実行結果を以下に示す。PVが一番多い記事の筆者は「一色」さんこのように、数値以外の(一意に特定可能な)何かのデータと、それに対応する値を関連付けるといったときに辞書が役に立つ。APIなどを呼び出す際に戻り値としてJSON形式のデータが返されることがよくある。したデータをPythonで扱う際にも辞書が適している(これについては何らかのタイミングで取り上げたい)。辞書のキーはイミュータブル最後に辞書のキーに使える値について簡単に説明しておこう。Pythonでは、辞書のキーとして使えるものは「変更不可能」(イミュータブル)なオブジェクトだけだ。文字列(上記コード例のURLなど)やタプルなどは辞書のキーとして使えるが、リストはその要素を変更できるのでキーには使えない。辞書自体も要素の変更や追加、削除が可能なので、他の辞書のキーとして使うことはできない。リストのようなミュータブルなオブジェクトが辞書のキーに使えないかといえば、一つには辞書のキーにリストを使って項目を登録できたとして、その後で別のキーとして使っている別のリストと同じ要素を持つようにリストを変更してしまったら、そのキーの値が不明になってしまうからだ。実行できない架空のコード例を以下に示す。True実行できないPythonコードこの実行できないコード例では、2つのリストkey_list1とkey_list2があり、それらの要素は最初は異なるものとなっている。1]」というキーで得るべき値は'foo'と'bar'のどちらだろう。したことが起こらないように、Pythonでは辞書のキーに使えるのはミュータブルなオブジェクトだけとなっている。「タプルならどんなものでもキーにできる」わけではない。タプルの要素がリストの場合、「タプルの要素であるリストの要素は変更可能」という話を前回にした。した場合には、タプルを辞書のキーとすることはできない。変更可能な要素を含んだタプルはキーにはできない実行した結果を以下に示す。実行結果エラーメッセージを読むと「リストはハッシュ不可能(unhashable)な型」とある。実は、Pythonの辞書はキーを基に「ハッシュ値」という値を算出して、関連する値へのアクセスに使用する。Pythonでは、ミュータブルなオブジェクトについては、間違って辞書のキーなどに利用できないように、ハッシュ値を算出する機能を持たないように設計されているので、こうしたエラーが発生したのである。まとめ今回は「キーと値」の組を管理するために使える「辞書」について見た。次回は、多数のデータを管理するためにPythonが組み込みで提供している最後のデータ構造である「集合」を取り上げる。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。