Pythonにおける辞書(dictionary)は非常に便利なデータ構造ですが、そのキーにはイミュータブル(変更不可能)なオブジェクトしか使用できないという制約があります。この制約は、辞書の高速な動作を保つためのもので、実際には「ハッシュ可能性」という特性に基づいています。本記事では、この「イミュータブルなキーとハッシュ可能性」について解説します。具体的なコード例、その詳細な解説、および応用例を3つ以上含めています。
イミュータブルとは?
イミュータブルとは、一度作成された後にその状態が変更できないオブジェクトを指します。Pythonにおける基本的なイミュータブルな型には、数値、文字列、タプルなどがあります。
ハッシュ可能性とは?
オブジェクトがハッシュ可能であるとは、そのオブジェクトのハッシュ値が生存期間中に変更されないということです。つまり、ハッシュ可能なオブジェクトはイミュータブルなオブジェクトです。
ハッシュ値の計算
Pythonにおけるハッシュ値は、`hash()`関数で計算することができます。例として、整数と文字列のハッシュ値を計算してみましょう。
# 整数のハッシュ値
hash_value_int = hash(42)
print(f'整数42のハッシュ値: {hash_value_int}')
# 文字列のハッシュ値
hash_value_str = hash("Python")
print(f'文字列"Python"のハッシュ値: {hash_value_str}')
辞書のキーとして使用できる型
辞書のキーとして使用できるのは、ハッシュ可能な型、すなわちイミュータブルな型だけです。以下の例では、整数、文字列、タプルをキーとして辞書を作成しています。
# 辞書の作成
my_dict = {
1: 'integer', # 整数
'name': 'string', # 文字列
(1, 2): 'tuple' # タプル
}
print(my_dict)
応用例
応用例1: タプルをキーとした辞書
タプルをキーとして使うことで、複数の属性でデータを分類することができます。
# 年齢と性別で分類
age_gender_dict = {
(25, 'male'): 'Taro',
(30, 'female'): 'Hanako',
(22, 'male'): 'Jiro'
}
print(age_gender_dict)
応用例2: 不変なキーでキャッシュを実装
イミュータブルなキーを使って、関数の戻り値をキャッシュする例です。
# キャッシュ用の辞書
cache = {}
def expensive_function(arg1, arg2):
if (arg1, arg2) in cache:
return cache[(arg1, arg2)]
# 重い処理(ここでは省略)
result = arg1 + arg2 # 仮の処理
cache[(arg1, arg2)] = result
return result
応用例3: frozensetをキーとした辞書
`frozenset`はイミュータブルな集合で、これも辞書のキーとして使えます。
# frozensetをキーとした辞書
frozenset_dict = {
frozenset([1, 2, 3]): 'frozenset 1',
frozenset(['a', 'b']): 'frozenset 2'
}
print(frozenset_dict)
まとめ
Pythonの辞書では、キーとして使用できるのはハッシュ可能な(イミュータブルな)オブジェクトだけです。この制約は、辞書の高速な動作を保つためのも
のです。イミュータブルなキーを活用することで、効率的なデータ構造やアルゴリズムを実装することが可能です。
コメント