高速なキー検索とデフォルトのための Python dict

Python dict は、キーによる高速検索のために、ハッシュ可能なキーを値にマップします。 各項目に一意の識別子があり、そのキーによって迅速にアクセスする必要がある場合に使用します。 dict.get を使用すると、検索を安全に保つために欠落しているキーのデフォルトを指定できます。 これにより、辞書はキーベースの検索タスクにぴったりと適合します。

キー検索の Python 辞書の例

出力:

ここに出力が表示されます...

出力:

user_2: Noah
user_3: unknown

この例の仕組み

  1. dict リテラルは、ユーザー ID から名前へのマッピングを作成します。辞書キーはハッシュ可能である必要があるため、文字列を選択するのが安全です。
  2. name_by_id["user_2"] は既存のキーの値を返しますが、キーが見つからない場合、この形式では KeyError が発生します。
  3. get は、キーが存在しない場合に提供されたデフォルトを返します。これにより、オプションのキーの例外が回避されます。

よくある間違い

間違い: キーがオプションの場合に d[key] を使用します。

間違っている:

status = status_by_order[order_id]

右:

status = status_by_order.get(order_id, "not found")

発生理由: d[key] はキーが見つからない場合に KeyError を生成しますが、キーが存在しない場合は get がデフォルトを返します。

間違い: リストのようなハッシュ化できないキーを使用します。

間違っている:

bad_key = ["A101"]
status_by_order[bad_key] = "shipped"

右:

good_key = ("A101",)
status_by_order[good_key] = "shipped"

この問題が発生する理由: 辞書キーはハッシュ可能である必要がありますが、リストはハッシュ可能ではありません。タプルは、その内容がハッシュ可能であればハッシュ可能であるため機能します。

間違い: 11.0True が別個のキーであると想定しています。

間違っている:

d = {1: "one", True: "bool"}

右:

d = {1: "one", 2: "two"}

この問題が発生する理由: 等しいと比較されるキーは同じ辞書エントリにインデックスを付けるため、後の代入によって以前の代入が上書きされます。

Python dict と list: どちらを使用するか

次の場合に辞書を使用します…次の場合にリストを使用します…
キーを値にマップし、そのキーで検索する必要があります。必要なのは、順序付けられた項目のシーケンスまたは位置アクセスだけです。
キーは、ID、コード、名前などの安定した識別子です。各項目の位置は、各項目にアクセスする主な方法です。

経験則: キーベースの検索には辞書を使用し、順序付けされたインデックスベースのアクセスにはリストを使用します。

パフォーマンスに関する考慮事項

Python の dict 実装は細かく調整されており、汎用マッピングとして非常に優れたパフォーマンスを発揮するため、キー検索を繰り返す場合のデフォルトの選択肢となっています。 順序付けられたインデックスベースのアクセスのみが必要な場合は、辞書は位置ではなくキーによってインデックス付けされるため、リストの方が単純になります。 dict ビュー オブジェクトを反復処理するときは、ループ中にエントリの追加または削除を避けてください。反復中の突然変異により RuntimeError が発生する可能性があるため、キーを変更する必要がある場合は、最初にキーをコピーします。

その他の例

デフォルトとオーバーライドをマージします (Python 3.9 以降):

defaults = {"retries": 2, "timeout": 5}
overrides = {"timeout": 10}
config = defaults | overrides
print(config)

| は新しい辞書を作成し、キーが重なった場合は右側の辞書が優先されるため、階層化された設定に役立ちます。

キーと値のペアから辞書を構築します。

language_labels = [("en", "Hello"), ("es", "Hola")]
labels_by_locale = dict(language_labels)
print(labels_by_locale)

dict() はキーと値のペアの反復可能を受け入れます。これは、データがタプルとして到着する場合に便利です。

Python 辞書を使用する場合

  • ID、コード、名前などの安定したキーによって値を取得または更新する必要があります。
  • 挿入順序と一致する予測可能な反復順序が必要です。
  • get または明示的なキー チェックを使用して、欠落しているキーに対する安全なデフォルトが必要です。
  • 明確な優先順位ルールを使用して辞書を組み合わせる必要があります。
  • 注文された項目への位置アクセスのみが必要な場合は、辞書を使用しないでください。この場合、リストの方が簡単です。