【Pythonのデータ構造】辞書(dict)を操作する<定義~要素へのアクセス(追加・更新・削除)>

スポンサーリンク
Pythonの基礎文法(辞書の使い方) Python

重要度:★★★★

Pythonが提供するデータ構造には大きく「リスト」「タプル」「辞書」の3種類があります。

図1 Pythonのデータ構造

それぞれ次のような特徴があります。

リスト(List)

[要素1, 要素2, ・・・] のように、”[]”(角カッコ)の中に要素が“,”(カンマ)区切りで並びます。リストは、ミュータブル(mutable)なデータ構造で、要素の追加・更新・削除を自由に行うことができます。

他言語の配列に近い扱い方がありますが、次のような違いがあります。

<他言語の配列との違い>

  1. 要素には、さまざまなデータ型(整数、文字列など)を混在することができる
  2. C言語のようにメモリアドレスを強く意識しない

リストの詳細は、こちらの記事で解説していますので参考にして下さい。


タプル(Tuple)

(要素1, 要素2, ・・・) のように、”()”(カッコ)の中に要素が“,”(カンマ)区切りで並びます。

タプルは、リストと類似していますがイミュータブルなデータ構造となります。つまり、リストのように一度定義したタプルは、要素の追加・更新・削除を行うことができません。

リストとの違いは次のようなものがあります。

<リストとの違い>

  1. イミュータブルで要素の追加・更新・削除ができない。
  2. リストよりも、生成速度が速く、メモリーの使用量が小さくて済む。

タプルの詳細は、こちらの記事で解説していますので参考にして下さい。


辞書(dictionary)

{key1:value1, key2:value2, } のように、“{}”(中カッコ)の中に、キー:値を1組とする要素が“,”(カンマ)区切りで並びます。タプルもリスト同様にミュータブル(mutable)なデータ構造で、要素の追加・更新・削除を自由に行うことができます。リストやタプルとの違いは次のようなものがあります。

<リストとの違い>

  1. 要素の並び順を意識することはない(キーを識別子として各要素にアクセスする)
  2. 同じキーを重複してもたせることはできない(値は重複できます)。

今回は、この「辞書(dictionary)」について「データ構造の基本」から「作り方」「要素へのアクセス(参照・取得・更新)」「辞書型の関数」について基礎から丁寧に図解で解説をします。

この記事を読むことで次のことが「できるわかる」ようになりますので最後までお付き合い下さい。

.

.

.

本サイトでの紹介内容は一例です。また、関数などの省略可能なオプション引数などについては割愛していますので、詳細や不明点などは必要に応じて公式サイトなどを参照してください。

【Python公式ドキュメント】https://docs.python.org/ja/3/library/stdtypes.html#mapping-types-dict

1. 辞書型(dictionary)とは

Pythonのデータ型である「辞書型」(dictionary)は、「リスト」や「タプル」と同じように複数の値を要素として管理するデータ構造の一つです。

「リスト」や「タプル」は、個々の要素を並び順(インデックス)で管理していますが、辞書の場合は、「キー(Key)」と呼ばれる識別子(ラベル)が割り振られ、個々の要素を管理します。

辞書の書式は、以下のように{}の中に、「キー(Key):値(Value)」を組合せた要素をもつ構造をとります。要素(値)へのアクセスは、キーを使って参照するので一つの辞書の中に同じキーを重複して持たせることはできません。よって、リストやタプルのように要素の位置を意識することはありません。

Python辞書の構文_rev0.1

また「キー(Key)」は後から変更できない性質上、イミュータブルな型をもつデータを採ります。「文字列」や「数値」「タプル」などのデータがキーになり得ます。

一方、値については、イミュータブルなデータ型の他、リストや辞書といったミュータブルなデータ型を採ることができます。

1.1. 辞書の基本

辞書型のデータ構造を実際にコードで確認してみましょう。次の<List1>は最も基本的な辞書の定義例となります。

キーにイミュータブルな「文字列」「数値」「タプル」データを指定し辞書を定義します。

result1 = {'a':1, 'b':2, 'c':3}                     # キーが文字列
result2 = {10:'apple', 20:'orange', 30:'pine'}      # キーが数字
result3 = {(1, 2, 3):'apple'}                       # キーがタプル(イミュータブル)

#-------------------------------------------
print(result1)                      #➀ {'a': 1, 'b': 2, 'c': 3}
print(type(result1))                #   <class 'dict'>

print(result2)                      #➁ {10: 'apple', 20: 'orange', 30: 'pine'}
print(type(result2))                #   <class 'dict'>

print(result3)                      #➂ {(1, 2, 3): 'apple'}
print(type(result3))                #   <class 'dict'>
<List1>の実行結果

>> {‘a’: 1, ‘b’: 2, ‘c’: 3}

>> <class ‘dict’>

>> {10: ‘apple’, 20: ‘orange’, 30: ‘pine’}

>> <class ‘dict’>

>> {(1, 2, 3): ‘apple’}

>> <class ‘dict’>

問題なく辞書が作成できました

次の<List2>は、「キー」にイミュータブルな値「リスト」を指定した場合の例です。

「キー」にはリストは採り得ませんのでエラーが発生しています。

result = {[1,2,3]:'apple'}      # キーがリスト(ミュータブル)

print(result)                   #➂ TypeError: unhashable type: 'list'
#-------------------------------------------
<List2>の実行結果

>> TypeError: unhashable type: ‘list’

エラーが発生しました

また最後に「キー」を重複させた場合の例を紹介しましょう。

次のようにエラーになることはありませんが、最後に指定した「キー」:「値」の組み合わせのみが辞書として作成されていることが分かります。

result = {'a':1, 'b':2, 'b':3}      #   キーを重複指定
print(result)                       #➅  {'a': 1, 'b': 3}
print(type(result))                 #   <class 'dict'>
#-------------------------------------------
辞書のキーを重複させた場合







1.2. dictクラスで辞書をつくる

辞書をつくる dictクラス

辞書(dict): dict( [ (キー1,  値1), (キー2, 値2)・・・ ] ) ———-➀

辞書(dict): dict( ( [キー1,  値1], [キー2, 値2] ・・・) ) ———-➁

辞書(dict): dict( 引数1 = 値1, 引数2 = 値2, ・・・ ) ———-➂

  1. タプル(キー、値)のリストをdictクラスの引数に指定する
  2. リスト [キー、値] のタプルをdictクラスの引数に指定する
  3. キー = 値 のキーワード引数をdictクラスの引数に指定する

辞書をつくる組込みクラスとしてdict()があります。

dictクラスの使い方は、引数の指定の方法によって3パターンに分けられます。

Python 公式ドキュメント dictクラス

https://docs.python.org/ja/3/library/stdtypes.html#dict

例1.タプル(キー、値)のリストをdictクラスの引数に指定するパターンです。

# タプル(キー、値)のリストを引数にとる
result = dict( [ ('key1', 111),  ('key2', 222),  ('key3', 333) ] )

print(result)               #➀ {'key1': 111, 'key2': 222, 'key3': 333}
print(type(result))         #➁ <class 'dict'>
#-------------------------------------------

例2. リスト [キー、値] のタプルをdictクラスの引数に指定するパターンです。

# リスト[キー、値]のタプルを引数にとる
result = dict( ( ['key1', 111],  ['key2', 222],  ['key3', 333] ) )

print(result)               #➀ {'key1': 111, 'key2': 222, 'key3': 333}
print(type(result))         #➁ <class 'dict'>
#-------------------------------------------

例3. キーワード引数で指定するパターンです。

引数名は文字列ではありませんが、辞書にすると文字列のキーとして作成されます。

# キー = 値 のキーワード引数を指定する
result = dict( key1 = 111,  key2 = 222,  key3 = 333 )

print(result)               #➀ {'key1': 111, 'key2': 222, 'key3': 333}
print(type(result))         #➁ <class 'dict'>
#-------------------------------------------

因みに、引数名を文字列とした場合の例ですが、SyntaxErrorが発生します。

result = dict( 'key1' = 111,  'key2' = 222,  'key3' = 333 )
# SyntaxError: keyword can't be an expression
#-------------------------------------------

1.3. dict.fromkeys()メソッドで辞書をつくる

dict.fromkeys()メソッド

辞書(dict): dict.fromkeys( イテレータ, 初期値 ) ———-➀

dictクラスのfromkeysメソッドで、初期値を指定して辞書をつくれます。

キーはリストや文字列などのイテレータで指定し、初期値は一つだけ指定できます。

Python 公式ドキュメント dict.fromkeys()メソッド

https://docs.python.org/ja/3/library/stdtypes.html?highlight=fromkeys#dict.fromkeys

例1 次は「キー」のイテレータをリストにした例です。

実行結果から(➀)、リストの要素ひとつひとつがキーとなり、第2引数の”123″で値が初期化された、辞書が作成されました。(②)


result = dict.fromkeys( ['key1', 'key2', 'key3'], 123 )

print(result)               #➀ {'key1': 123, 'key2': 123, 'key3': 123}
print(type(result))         #➁ <class 'dict'>
#-------------------------------------------

次は「キー」のイテレータをタプルにした例です。

同様に辞書が作成されました。(②)

result = dict.fromkeys( ('key1', 'key2', 'key3'), 123 )

print(result)               #➀ {'key1': 123, 'key2': 123, 'key3': 123}
print(type(result))         #➁ <class 'dict'>
#-------------------------------------------

「キー」に文字列を指定することもできます。

その場合は、一文字づつに分解されそれぞれが「キー」となります。また、第2引数を省略すると値なし” None ”として初期化されます。

result = dict.fromkeys( 'ABC' )

print(result)               #➀ {'A': None, 'B': None, 'C': None}
print(type(result))         #➁ <class 'dict'>
#-------------------------------------------

2.  辞書の更新/追加と削除

ミュータブルなデータ構造である辞書は「キー:値」を変更/追加し、要素を削除することができます。これらの操作は対象の「キー」を指定することでおこなえます。

辞書の更新・追加と削除

辞書(dict)

  • 更新と追加   : 辞書名[キー]= 値  ———-➀
  • 削除(要素指定) : del 辞書名[キー]  ———-②
  • 削除(全要素)  : 辞書名.clear    ———-③

Python 公式ドキュメント

https://docs.python.org/ja/3/library/stdtypes.html?highlight=fromkeys#dict

2.1 辞書の更新と追加

辞書の更新と追加について解説します。


例1.既存の辞書の値を変更(更新)するには、➁、➂のように

「辞書名[キー]= 新値」といったように、値を変更したいキーを指定し、新値を代入することで可能となります。

更新の場合は、キーは既存のものを指定する必要があります。

result = { 'key1' : 1, 'key2' : 2, 'key3' : 3 }
print(result)   #➀ {'key1': 1, 'key2': 2, 'key3': 3}

# キー(key1)の値を10に更新する
result['key1'] = 10
print(result)   #➁ {'key1': 10, 'key2': 2, 'key3': 3}

# キー(key3)の値を30に更新する
result['key3'] = 30
print(result)   #➂ {'key1': 10, 'key2': 2, 'key3': 30}
#------------------------------------------------------

新しい「キーと値」を追加したい場合も、上の更新と同じ要領でおこないます。

追加の場合は、新規の「キー」を指定します。次の➃の例は ‘key4’という新キーに、

40という値を追加しています。

# キー(key4)の値を30に追加する
result['key4'] = 40
print(result)   #➃ {'key1': 10, 'key2': 2, 'key3': 30, 'key4': 40}
#------------------------------------------------------

2.2 辞書の要素の削除

辞書の要素の削除について解説します。


例1.辞書から要素を個別に指定して削除するには、「 del 」ステートメントを使います。「 del 辞書名[ 対象キー ] 」 といったように書きます。

次の例では、もともとの①の辞書から、➁で’key1’キー、➂で’key2’キーを指定して対応する値とセットで削除しています。

result = { 'key1' : 1, 'key2' : 2, 'key3' : 3 }
print(result)       #➀ {'key1': 1, 'key2': 2, 'key3': 3}

del result['key1']
print(result)       #➁ {'key2': 2, 'key3': 3}  キー(key1)と対応する値が削除される

del result['key2']
print(result)       #➂ {'key3': 3}  キー(key2)と対応する値が削除される
#------------------------------------------------------

また、当然ですが存在しない「キー」を指定して削除しようとしても、エラーが発生します。➃では削除済みの ‘ key1 ‘を指定していますが、” KeyError ”が発生しています。

del result['key1']
print(result)       #➃ KeyError: 'key1'
#------------------------------------------------------

例2.辞書のclear()メソッドを使うことで、要素をすべて一度にクリアするこも可能です。➁のように「 辞書名.clear() 」とすることで空の辞書になることを確認できます。

result = { 'key1' : 1, 'key2' : 2, 'key3' : 3 }
print(result)       #➀ {'key1': 1, 'key2': 2, 'key3': 3}

result.clear()
print(result)       #➁ {} 全ての要素が削除され、空の辞書となる
#------------------------------------------------------

以上が辞書の更新/追加と削除の解説でした。

3. まとめ

 最後に、この記事のまとめになります。

  • 辞書は「キー」と「値」がペアになったデータ構造である
  • 辞書の要素には順番がなく、インデックスはない
  • 要素の指定には、「キー」をつかう

最後までお読み頂きありがとうございました。

次の記事では、「<辞書②>参照方法・使い方」について解説します。

タイトルとURLをコピーしました