HOWTO · Python
Python のループ内の辞書にキーと値のペアを追加する
Python のループ内でキーと値のペアをディクショナリに追加する方法を学びます。
このページの内容
辞書に項目を追加または更新するには、ループ内で dictionary[key] = value と代入します。キーと値が別々のイテラブルにある場合は、forループで zip() を使って対応する項目を組み合わせます。インデックス自体が必要なときは whileループを使います。
ループ内で辞書にキーと値のペアを追加する
まず辞書を用意し、ループで各ペアを処理するたびに、対応する値をキーに代入します。値にはさまざまな種類のPythonオブジェクトを使えますが、キーはハッシュ可能でなければなりません。次の例では、名前と点数を組み合わせます。
zip()でキーと値を組み合わせる
zip(keys, values) は、反復のたびに各イテラブルから項目を1つずつ取り出し、ペアにして返します。次の例を実行します。
このセクションのコードと表示されるラベルや出力は英語のままです。
keys = ["Ada", "Linus", "Grace"]
values = [98, 91, 100]
scores = {}
for key, value in zip(keys, values):
scores[key] = value
print(scores)
{'Ada': 98, 'Linus': 91, 'Grace': 100}
代入によって、各点数が対応する名前をキーとして保存されます。この方法は、値がリストや関数など、ほかのオブジェクトの場合にも使えます。ハッシュ可能である必要があるのは辞書のキーだけです。
インデックスが必要な場合はwhileループを使う
別の処理で位置を参照する必要がある場合は、インデックスを使うループが便利です。終了位置を決め、反復ごとにインデックスを増やします。
このセクションのコードと表示されるラベルや出力は英語のままです。
keys = ["Ada", "Linus", "Grace"]
values = [98, 91, 100]
scores = {}
index = 0
limit = min(len(keys), len(values))
while index < limit:
scores[keys[index]] = values[index]
index += 1
ここでは limit によって、両方のリストに存在する位置だけにアクセスします。通常のペア作成なら、for key, value in zip(keys, values) のほうが短く、インデックスを自分で管理する必要もありません。
入力数の不一致と既存キーを扱う
デフォルトでは、zip() は最も短いイテラブルの要素がなくなると停止します。長いほうに残った項目は使われません。すべてのキーに値が必要な場合は、ループの前に入力の長さを比較し、不一致をプログラムでどう扱うか決めてください。
辞書にすでにあるキーに代入すると、そのキーの以前の値が置き換わります。同じキーの項目が二重に作られるわけではありません。両方の値を残したい場合は、値としてコレクションを保存し、そこに追加します。キーはハッシュ可能である必要があるため、文字列、数値、ハッシュ可能な要素だけから成るタプルは使えますが、変更可能なリストや辞書は使えません。
結果を表示して計算量を理解する
小さな辞書を確認するには print(scores) を使うか、scores.items() を反復してキーと値を個別に整形します。この例の値であれば、辞書の簡単な表示は一定の結果になります。独自のオブジェクトは、メモリアドレスを含む表現で表示されることがあります。読みやすく再現性のある出力が必要な場合は、必要な属性を指定して表示してください。
m 個のペアを処理すると、ループは m 回代入します。辞書への各代入は平均 O(1) なので、処理時間は平均 O(m) です。これは平均的な場合の計算量であり、ハッシュの衝突があると個々の代入に時間がかかることがあります。結果の辞書には最大で m 個の異なるキーが入り、追加で使う空間は O(m) です。zip() イテレーター自体が使う補助空間は一定です。辞書にすでに d 個の項目がある場合、対応するキーの値が置き換わらない限り既存の項目は残り、最終的なサイズは最大 d + m です。