Python 辞書(Dictionary)

PythonBeginner
オンラインで実践に進む

はじめに

Python において、辞書(dictionary)は、key: valueペアの順序付けられた(Python 3.7 以降)コレクションです。辞書は、データをミュータブル(変更可能)でインデックス付けされた方法で格納するために使用され、重複するキーを許可しません。辞書に対する主な操作は、キーに関連付けて値を格納することと、キーが与えられたときに値を取り出すことです。

例えば、猫の情報を格納するために辞書を作成できます。

## 辞書:キーと値のペアのコレクション
my_cat = {
    'size': 'fat',          ## キー: 'size', 値:'fat'
    'color': 'gray',        ## キー: 'color', 値:'gray'
    'disposition': 'loud'   ## キー: 'disposition', 値:'loud'
}

この実験(Lab)では、辞書の作成方法、データのアクセスと変更方法、辞書に対するイテレーション(反復処理)、および効果的に作業するための様々なユーティリティメソッドの使い方を学びます。

辞書データのアクセスと変更

このステップでは、辞書を作成し、新しいキーと値のペアを追加したり、既存のものを更新したり、サブスクリプト演算子 [] を使用して値を取得する方法を学習します。

[] 演算子を使用してキーに値を代入することで、辞書のエントリを追加または更新できます。キーが既に存在する場合は、その値が更新されます。キーが存在しない場合は、新しいキーと値のペアが追加されます。

注記: WebIDE (VS Code のようなもの) の使用に慣れていない場合は、こちらの実験 (lab) で先に学習してください。

コードを記述するためのファイルを作成することから始めましょう。

まず、左側のファイルエクスプローラーから ~/project ディレクトリにある main.py ファイルを開きます。

次に、main.py に次のコードを追加します。このコードは辞書を定義し、新しいキーと値のペアを追加します。

## サブスクリプト演算子を使用した辞書エントリの追加または更新
my_cat = {
 'size': 'fat',
 'color': 'gray',
 'disposition': 'loud',
}
my_cat['age_years'] = 2  ## 新しいキーと値のペアを追加
print(my_cat)

スクリプトを実行するには、ターミナルを開き、次のコマンドを実行します。

python3 main.py

コンソールに更新された辞書が出力されるはずです。

{'size': 'fat', 'color': 'gray', 'disposition': 'loud', 'age_years': 2}

サブスクリプト演算子 [] の中にキーを使用して値を取得することもできます。'size' キーに関連付けられた値にアクセスして出力するように main.py ファイルを変更してみましょう。

main.py の内容を次のコードに置き換えてください。

my_cat = {
 'size': 'fat',
 'color': 'gray',
 'disposition': 'loud',
}
print(my_cat['size'])

スクリプトを再度実行します。

python3 main.py

出力は 'size' キーの値になります。

fat

辞書に存在しないキーにアクセスしようとすると、Python は KeyError を発生させることに注意してください。これを実際に見てみましょう。main.py のコードをこれに置き換えてください。

my_cat = {
 'size': 'fat',
 'color': 'gray',
 'disposition': 'loud',
}
print(my_cat['eye_color'])

スクリプトを実行します。

python3 main.py

キー 'eye_color' が my_cat 辞書に存在しないため、これにより KeyError が発生します。

Traceback (most recent call last):
  File "/home/labex/project/main.py", line 5, in <module>
    print(my_cat['eye_color'])
KeyError: 'eye_color'

確認のために、main.py を最初の例(新しいキーを追加して辞書全体を出力する例)に戻してください。

## サブスクリプト演算子を使用した辞書エントリの追加または更新
my_cat = {
 'size': 'fat',
 'color': 'gray',
 'disposition': 'loud',
}
my_cat['age_years'] = 2  ## 新しいキーと値のペアを追加
print(my_cat)

辞書の反復処理(Iteration)

このステップでは、辞書をループ処理するさまざまな方法を探ります。Python は、辞書のキー、値、またはその両方を反復処理するためのいくつかのメソッドを提供します。

values() を使用した値の反復処理

values() メソッドは、辞書内のすべて値のリストを表示するビューオブジェクトを返します。このオブジェクトをループすることで、各値にアクセスできます。

main.py ファイルをクリアし、次のコードを追加します。

## .values() メソッドを使用して辞書の値に対して反復処理を行う
pet = {'color': 'red', 'age': 42}
for value in pet.values():  ## すべての値に対してループ
    print(value)

スクリプトを実行します。

python3 main.py

出力では、各値が新しい行に表示されます。

red
42

keys() を使用したキーの反復処理

同様に、keys() メソッドは辞書のキーを含むビューオブジェクトを返します。pet.keys() を使用することもできますが、辞書自体に対して直接反復処理を行う方が、キーをループ処理するためのより一般的で Python らしい方法です。

main.py を次のコードで更新します。

## 辞書に対して直接反復処理を行うとキーがループされる(デフォルトの動作)
pet = {'color': 'red', 'age': 42}
for key in pet:  ## for key in pet.keys() と同等
    print(key)

スクリプトを実行します。

python3 main.py

キーが出力されます。

color
age

items() を使用したキーと値のペアの反復処理

反復処理中にキーと値の両方が必要な場合、items() メソッドは非常に役立ちます。これは、各アイテムが (key, value) タプルであるビューオブジェクトを返します。

items() を使用するように main.py を更新します。

## .items() メソッドを使用してキーと値のペアに対して反復処理を行う
pet = {'color': 'red', 'age': 42}
for key, value in pet.items():  ## タプルを key と value にアンパックする
    print(f'Key: {key} Value: {value}')

ここでは、タプルアンパック(for key, value in ...)を使用して、各反復処理でタプルの最初の要素を key に、2 番目の要素を value に割り当てています。

スクリプトを実行します。

python3 main.py

出力は、各キーと値のペアを示す整形された文字列になります。

Key: color Value: red
Key: age Value: 42

安全なアイテムへのアクセスと追加

このステップでは、KeyError を発生させることなく安全に値を取得する方法と、条件付きでアイテムを追加する方法を学びます。

get() を使用した安全なアクセス

ステップ 1 で見たように、[] を使用して存在しないキーにアクセスしようとすると KeyError が発生します。get() メソッドは、キーにアクセスするためのより安全な方法を提供します。キーが存在する場合はその値を返しますが、存在しない場合はエラーを発生させる代わりに None を返します。

main.py をクリアし、次のコードを追加します。

## .get() メソッド:値を安全に取得し、キーが存在しない場合は None を返す
wife = {'name': 'Rose', 'age': 33}

print(f'My wife name is {wife.get("name")}')
print(f'She is deeply in love with {wife.get("husband")}')

スクリプトを実行します。

python3 main.py

出力は、get() が 'name' の値と、欠落しているキー 'husband' に対して None を返したことを示しています。

My wife name is Rose
She is deeply in love with None

get() に 2 番目の引数としてデフォルト値を指定することもできます。この値は、キーが見つからなかった場合に返されます。

main.py を変更してデフォルト値を指定します。

wife = {'name': 'Rose', 'age': 33}

print(f'She is deeply in love with {wife.get("husband", "lover")}')

再度実行します。

python3 main.py

これで、出力にはカスタムのデフォルト値が使用されます。

She is deeply in love with lover

setdefault() を使用した条件付きの追加

setdefault() メソッドは、キーがまだ存在しない場合にのみキーと値のペアを追加するための簡潔な方法を提供します。キーをチェックし、存在する場合はそのキーの値を返します。存在しない場合は、指定された値でキーを挿入し、その値を返します。

main.py を更新して setdefault() を使用します。

wife = {'name': 'Rose', 'age': 33}
wife.setdefault('has_hair', True) ## 'has_hair' は存在しないため追加される。
wife.setdefault('name', 'Lily') ## 'name' は存在するため、辞書は変更されない。
print(wife)

スクリプトを実行します。

python3 main.py

出力は、'has_hair' が追加されたが、'name' の値は更新されなかったことを示しています。

{'name': 'Rose', 'age': 33, 'has_hair': True}

辞書からのアイテムの削除

このステップでは、辞書からアイテムを削除するためのさまざまな方法を練習します。

pop() を使用した削除

pop() メソッドは、指定されたキーを持つアイテムを削除し、その値を返します。キーが見つからない場合、デフォルト値が提供されない限り KeyError を発生させます。

main.py をクリアし、pop() の動作を確認するために次のコードを追加します。

wife = {'name': 'Rose', 'age': 33, 'hair': 'brown'}
removed_value = wife.pop('age')
print(f"Removed value: {removed_value}")
print(wife)

スクリプトを実行します。

python3 main.py

出力は、削除された値と、削除後の辞書を示しています。

Removed value: 33
{'name': 'Rose', 'hair': 'brown'}

popitem() を使用した削除

popitem() メソッドは、辞書内で最後に追加されたアイテムを削除します(Python 3.7 以降)。削除されたアイテムを (key, value) タプルとして返します。

main.py を変更して popitem() を使用します。

wife = {'name': 'Rose', 'age': 33, 'hair': 'brown'}
removed_item = wife.popitem()
print(f"Removed item: {removed_item}")
print(wife)

スクリプトを実行します。

python3 main.py

最後のアイテム ('hair', 'brown') が削除され、出力されます。

Removed item: ('hair', 'brown')
{'name': 'Rose', 'age': 33}

del キーワードを使用した削除

del キーワードを使用して、キーに基づいてアイテムを削除できます。削除されたアイテムの値を返すことはありません。

main.py を変更して del を使用します。

wife = {'name': 'Rose', 'age': 33, 'hair': 'brown'}
del wife['age']
print(wife)

スクリプトを実行します。

python3 main.py

'age' キーなしの辞書が出力されます。

{'name': 'Rose', 'hair': 'brown'}

clear() を使用したすべてのアイテムの削除

clear() メソッドは、辞書からすべてのアイテムを削除し、空にします。

main.py を変更して clear() を使用します。

wife = {'name': 'Rose', 'age': 33, 'hair': 'brown'}
wife.clear()
print(wife)

スクリプトを実行します。

python3 main.py

出力は空の辞書になります。

{}

確認のために、main.py が pop() を使用して 'age' キーを削除し、最終的な辞書を出力していることを確認してください。

wife = {'name': 'Rose', 'age': 33, 'hair': 'brown'}
wife.pop('age')
print(wife)

辞書ユーティリティ操作

このステップでは、キーと値の存在確認、整形出力(pretty-printing)、辞書のマージなど、便利な辞書ユーティリティについて学習します。

in を使用したキーと値の確認

in 演算子を使用して、辞書内にキーが存在するかどうかを確認できます。

main.py をクリアし、次のコードを追加します。

person = {'name': 'Rose', 'age': 33}

print(f"'name' in person: {'name' in person}")
print(f"'height' in person: {'height' in person}")

スクリプトを実行します。

python3 main.py

出力は、存在するキーに対しては True、存在しないキーに対しては False を示します。

'name' in person: True
'height' in person: False

values() メソッドと in を組み合わせて、辞書内に値が存在するかどうかを確認することもできます。

main.py を変更します。

person = {'name': 'Rose', 'age': 33}

print(f"'Rose' in person.values(): {'Rose' in person.values()}")
print(f"33 in person.values(): {33 in person.values()}")
print(f"'John' in person.values(): {'John' in person.values()}")

実行します。

python3 main.py

出力:

'Rose' in person.values(): True
33 in person.values(): True
'John' in person.values(): False

pprint を使用した整形出力 (Pretty Printing)

辞書が大きい場合、直接出力すると長くて読みにくい一行になることがあります。pprint モジュールは、辞書をより読みやすい形式で整形するための「pretty-print」機能を提供します。

main.py を更新します。

import pprint

wife = {'name': 'Rose', 'age': 33, 'has_hair': True, 'hair_color': 'brown', 'height': 1.6, 'eye_color': 'brown'}
pprint.pprint(wife)

スクリプトを実行します。

python3 main.py

出力はきれいに整形され、キーはアルファベット順にソートされています。

{'age': 33,
 'eye_color': 'brown',
 'hair_color': 'brown',
 'has_hair': True,
 'height': 1.6,
 'name': 'Rose'}

辞書のマージ

辞書アンパック演算子 ** (Python 3.5 以降で利用可能) を使用して、2 つの辞書をマージできます。キーが重複している場合、2 番目の辞書の値が使用されます。

次のコードで main.py を更新します。

dict_a = {'a': 1, 'b': 2}
dict_b = {'b': 3, 'c': 4}
dict_c = {**dict_a, **dict_b}
print(dict_c)

スクリプトを実行します。

python3 main.py

出力は、両方の辞書からのすべてのアイテムを含む新しい辞書です。キー 'b' の値が dict_b からの 3 であることに注意してください。

{'a': 1, 'b': 3, 'c': 4}

まとめ

Python の辞書に関するこの実験(Lab)を完了されたことをお祝いします!

この実験では、Python で最も強力なデータ構造の一つである辞書を操作するための基本的な操作を学びました。以下の内容を網羅しました。

  • 作成、アクセス、変更: {} を使用して辞書を作成し、添字演算子 [] を使用してデータの追加、更新、取得を行いました。
  • イテレーション(反復処理): keys(), values(), items() メソッドを使用して、キー、値、キーと値のペアをループ処理しました。
  • 安全な操作: get() を使用して KeyError を回避する方法、および条件付きでアイテムを追加するための setdefault() の使用法を学びました。
  • アイテムの削除: pop(), popitem(), del キーワード、clear() を使用したアイテムの削除方法を学びました。
  • ユーティリティ操作: in 演算子によるメンバーシップの確認、pprint による出力の整形、** アンパック演算子による辞書のマージを学びました。

辞書を習得することは、熟練した Python プログラマーになるための重要なステップです。これらの概念を練習し続け、より複雑で効率的なアプリケーションを構築してください。