Python入門|辞書操作の基本をマスター【dict型】のイメージ画像

Python入門|辞書操作の基本をマスター【dict型】

  • 公開日:2018/05/31
  • 更新日:2018/10/19
  • 投稿者:n bit

今回はPythonの【dict型】辞書について学習していきます。辞書の概念や基本的な作成方法や、変数を利用した作成方法、【dict型】辞書のキーを使った要素の取得、追加、変更、削除方法等を実際のコードと出力結果を交えながら解説します。

  • Python

この記事は約 分で読めます。(文字)

dict【辞書】とは

【dict型】辞書のデータ型がまずどのようなものか解説していきます。リスト型と同じように変数内で複数の値を持つことができます。基本的な考え方やイメージはリスト型とよく似ています。

リスト型との大きな違いはリストは各要素にインデックス番号が割り振られていましたが、辞書では各要素に任意でキー(key)を割り振ることができます。

Python dictとは

【dict型】辞書操作の基本

まだぼんやりとしたイメージかと思いますが実際に【dict型】辞書の基本操作を行っていく中でしっかりと理解していくことができますので安心してください。

【dict型】辞書の作成方法

【dict型】辞書を作成するためにはキーと値を【: 】でペアにして波括弧【{} 】で全要素を囲み、各要素間は【, 】でつなぎます。下記のコードを参考にして実際に作成してみましょう。

x = {'A':'a', 'B':'b', 'C':'c', 'D':'d'}

print(type(x))
print(x)

出力結果

<class 'dict'>

{'C': 'c', 'D': 'd', 'A': 'a', 'B': 'b'}

出力されたデータ型のタイプが'dict'になっていることが確認できます。'dict'はdictioaly(辞書)の略です。

【key(s)】に紐付ける値を【value(s)】、【key(s)】と【value(s)】のセットが【item(s)】となります。

作成時の注意点

【dict型】辞書を作成するときにはいくつか注意点があります。

要素の並び順は決まっていない

リストは各要素の並び順が決まっていましたが【dict型】辞書は各要素の並び順が決まっていません。試しに下記のコードを3回実行しましたら出力されている結果が毎回違うことに注目してください。

x = {'A':'a', 'B':'b', 'C':'c', 'D':'d'}

print(x)

出力結果

# 1

{'C': 'c', 'D': 'd', 'A': 'a', 'B': 'b'}

# 2
{'A': 'a', 'B': 'b', 'D': 'd', 'C': 'c'}

# 3
{'D': 'd', 'C': 'c', 'B': 'b', 'A': 'a'}
キーの重複はNG

こちらの注意事項は特に重要で、キーとして利用する値は重複することができません。

x = {'A':'a', 'A':'b', 'C':'c', 'D':'d'}

print(type(x))
print(x)

出力結果

<class 'dict'>

{'D': 'd', 'C': 'c', 'A': 'b'}

キーが重複していた場合エラーとはならず、重複しているどちらかの要素('A':'a'が無い)が含まれなくなってしまいます。エラーが返されず気づきにくいので注意してください。

データ型は混ぜても構成できる

各要素の値には様々なデータ型が格納できます。また、1つのデータ型に限定することなく複数のデータ型を混在させて格納しても問題ありません。各要素の値の記述方法はそれぞれのデータ型の記述方法に従います。

例えば、int型、float型、bool型、str型を混在させて【dict型】辞書を作成する場合は下記のようになります。

x = {'A':10, 'B':10.5, 'C':False, 'D':'a'}

print(type(x))
print(x)

出力結果

<class 'dict'>

{'A': 10, 'C': False, 'D': 'a', 'B': 10.5}

様々なデータ型を混在させてdict型変数を作成しても出力されたデータ型のタイプは正しく'dict'になっているのが確認できます。

【dict型】辞書の中にリストを含むことができる

int型、float型、bool型、str型以外に各要素の値にはリストも格納することもできます。

x = {'A':[95, 68, 76, 98, 82], 'B':[86, 72, 91, 88, 73], 'C':[76, 77, 89, 99, 71]}

print(type(x))
print(x)

出力結果

<class 'dict'>

{'A': [95, 68, 76, 98, 82], 'C': [76, 77, 89, 99, 71], 'B': [86, 72, 91, 88, 73]}

変数から【dict型】辞書を作成する

リストなどを格納する場合は記述が長くなりますし、またデーターベースからの取得や、何かの処理による出力結果などをまとめて格納する場合などが考えられます。その場合は変数を利用して【dict型】辞書を作成することもできます。

a_key = 'A'

a_value = [95, 68, 76, 98, 82]
b_key = 'B'
b_value = [86, 72, 91, 88, 73]
c_key = 'C'
c_value = [76, 77, 89, 99, 71]
x = {a_key:a_value, b_key:b_value, c_key:c_value}
print(type(x))
print(x)

出力結果

<class 'dict'>

{'A': [95, 68, 76, 98, 82], 'C': [76, 77, 89, 99, 71], 'B': [86, 72, 91, 88, 73]}

直接記述した場合と同じ出力結果が得られていることが確認できます。

【dict型】辞書のキーを使った要素の取得、追加、変更、削除方法

【dict型】辞書のキーを使った要素の取得、追加、変更、削除方法を解説していきます。

リストでは取得や、変更、削除等を行うのにインデックス番号を利用しました。辞書ではインデックス番号が用意されていませんので、代わりにキーを利用して各要素にアクセスし取得、追加、変更、削除の操作を行います。

キーを使った要素の取得方法

変数名の後に角括弧【[] 】をつけて要素のキーを記述することで取得できます。

x = {'A':'a', 'B':'b', 'C':'c', 'D':'d'}

z = x['B']
print(z)

出力結果

b

キー「'B'」に対応する値「'b'」が取得されていることが確認できます。

キーを使った要素の追加方法

リストの基本操作ではインデックス番号の指定による要素の追加を行うことができませんでした。しかし、辞書ではキーを使った要素の追加を行うことができます。

変数名の後に角括弧【[] 】をつけて新しく追加する要素のキーを記述し、新しい値を代入することで要素を追加できます。

x = {'A':'a', 'B':'b', 'C':'c', 'D':'d'}

x['Z'] = 'z'
print(x)

出力結果

{'A': 'a', 'C': 'c', 'D': 'd', 'Z': 'z', 'B': 'b'}

出力結果にキー「'Z'」の要素が追加されているのが確認できます。

キーを使った要素の変更方法

キーを使った要素の値の変更方法は変数名の後に角括弧【[] 】をつけて変更する要素のキーを記述し、新しい値を代入します。

x = {'A':'a', 'B':'b', 'C':'c', 'D':'d'}

x['B'] = 'z'
print(x)

出力結果

{'A': 'a', 'C': 'c', 'D': 'd', 'B': 'z'}

出力結果からキー「'B'」の要素の値が「'b'」から「'z'」へ変更されているのが確認できます。

キーを使った要素の削除方法

キーを使った要素の削除ではdelを利用します。delの後に変数名と削除したい要素のキーを指定してください。

x = {'A':'a', 'B':'b', 'C':'c', 'D':'d'}

del x['B']
print(x)

出力結果

{'A': 'a', 'C': 'c', 'D': 'd'}

キー「'B'」の要素が削除されているのが確認できます。

【dict型】辞書の使いどころ

前回学習した【list型】リストの使いどころは「個別のラベリングが不要な値の集団」でした。すでにお気づきかとは思いますが【dict型】辞書の使いどころは【list型】リストとは逆で、利用するケースは「個別のラベリングが必要な値の集団」を扱う場合です。

  • 【list型】リスト:個別のラベリングが不要な値の集団
  • 【dict型】辞書:個別のラベリングが必要な値の集団

【list型】リストでも利用した事例を使って考えてみましょう。

事例

次のデータベースをもとにいくつか目的別の事例を考えてみましょう。

参考データベース

参考データベースは、3クラスで各クラスの人数が40人のテストの点数データを集めたものとします。

クラス名性別氏名点数
a山田65
b伊藤78
c井上95








a木下83
c川崎91

目的例1:テストの平均点を求めたい

ケース1は「テストの平均点を求めたい」場合です。平均点を求めるだけなら点数データだけがあれば良いためラベルが必要なくリストでデータを用意することができました。

  • ラベル不要、点数データだけがあれば良い = リストでOK

目的例2:赤点を取っている人の名前を知りたい

ケース2は「赤点をとっている人の名前を知りたい」場合です。この場合は、点数データとその点数データに紐付く氏名がラベルとして必要でしたね。

  • ラベル(名前)必要 = 【dict型】辞書でOK

このような場合に【dict型】辞書が必要です。コードとして記述すると下記のようになります。

x = {'山田':65, '伊藤':78, '井上':95, ・・・, '木下':83, '川崎':91}

これで赤点を取っている生徒をピックアップした後にキーから名前を判別することができます。逆にキーとなる氏名から各生徒の点数を取得することもできますね。

もちろんPythonのプログラミングでは目的2を達成するために違う方法を取ることもできます。最終的にはケースバイケースでその時の状況にもよりますが、まずは、「個別のラベリングが必要な値の集団」を扱うときに利用できるデータ型と理解しておけばよいでしょう。

今日のdot

【dict型】辞書はリストに並びプログラミングでは頻繁に利用します。基本的な操作をしっかりとマスターしておきましょう。

空dictから辞書を作成

【dict型】辞書はリストのように演算子を使うことができません。そのため\(+=\)を使った要素の追加もできないのですが、ここまで学習した内容を応用して同じような方法をとることができます。最後にその作成方法を解説しておきましょう。

最初に空dictを作成しますが、作成方法は今までの空文字列や空リストの作成方法と一緒で、波括弧【{} 】内を空にして変数に代入するだけです。

後は新規に追加したいキーを指定してそれぞれの値を代入していきましょう。

x = {}

x['A'] = [95, 68, 76, 98, 82]
x['B'] = [86, 72, 91, 88, 73]
x['C'] = [76, 77, 89, 99, 71]
print(type(x))
print(x)

出力結果

<class 'dict'>

{'C': [76, 77, 89, 99, 71], 'B': [86, 72, 91, 88, 73], 'A': [95, 68, 76, 98, 82]}