HOWTO · Python
Python 辞書の交差
この記事では、新しい辞書を簡単かつ効率的に作成するために、Python で 2つの辞書または複数の辞書に対して交差を実行するさまざまな方法について説明します。
このページの内容
Pythonには、辞書を交差させる単一の組み込み操作はありません。共通キーが必要なのか、キーと値の両方が一致するペアが必要なのか、それとも値を選択または結合した新しい辞書が必要なのかに応じて、方法を選びましょう。
辞書の交差とは?
辞書は、一意でハッシュ可能なキーと値を対応付けます。値には、リストのように変更可能またはハッシュ不可能なものを含め、あらゆるPythonオブジェクトを指定できます。「辞書の交差」は、各辞書に存在するキーを残すこと、キーと値の両方が一致するペアを残すこと、または共通キーから新しい辞書を作ることを指す場合があります。これらは結果が異なるため、コードを選ぶ前に必要な結果を決めてください。
共通キーで辞書を交差させる
辞書内包表記を使うと、2つ目の辞書にも存在するキーだけを1つ目の辞書から取り出せます。この方法では、値には1つ目の辞書の値が使われます。次の例は、正常に動作するケースを単独で示しています。
このセクションのコードと表示されるラベルや出力は英語のままです。
first = {"name": "Ada", "team": "blue", "level": 3}
second = {"team": "green", "level": 4, "active": True}
shared = {key: first[key] for key in first if key in second}
print(shared)
結果にはteamとlevelが含まれ、値はfirstから取得されます。辞書の挿入順序はfirstの反復順序に従うため、選択された項目もその順序で並びます。2つ目の辞書の値を使うには、式の中でsecond[key]と記述します。両方の値を結合する場合は、用途に適したタプル、リスト、その他の値を式で作成してください。
たとえば、次の方法では両方の辞書にある文字列の値を連結します。
first = {1: "My", 2: "I", 3: "age"}
second = {1: "name", 2: "live", 4: "year"}
joined = {key: first[key] + " " + second[key] for key in first if key in second}
print(joined)
構文の詳細は、辞書内包表記を参照してください。
キーと値のペアが一致する辞書の交差
キーと値が両方の辞書で一緒に一致するペアだけを結果に含めるには、dict.items()を使います。辞書のitems()ビューで集合演算を行うには、ペア内のキーと値がどちらもハッシュ可能である必要があります。特に、リストの値はこの集合演算の要素にできません。ここでの&演算子は2つのitemsビューに作用するもので、辞書の演算子ではありません。
このセクションのコードと表示されるラベルや出力は英語のままです。
first = {"A": 1, "B": 6, "C": 3, "D": 5}
second = {"A": 1, "C": 4, "D": 5, "E": 2}
matching_pairs = dict(first.items() & second.items())
print(matching_pairs)
この方法では、("A", 1)や("D", 5)などのペアが残ります。2つ目の辞書では"C"に別の値が対応しているため、("C", 3)は除外されます。キーだけが必要なら、代わりにキーのビュー同士を交差させます。この演算の結果は辞書ではなく集合です。
first = {"A": 1, "B": 6, "C": 3}
second = {"A": 9, "C": 4, "D": 2}
shared_keys = first.keys() & second.keys()
print(shared_keys)
次の処理で辞書が必要な場合は、shared_keysを使った内包表記で作成し、どちらの辞書から値を取得するか明示してください。
複数の辞書を交差させる
3つ以上の辞書では、それぞれのキーのビューを交差させ、すべての辞書に存在するキーを探します。その後、選んだ辞書の値を使って結果を作成します。値もすべて一致する必要があるキー・値ペアの交差とは異なります。
このセクションのコードと表示されるラベルや出力は英語のままです。
first = {"A": 1, "B": 6, "C": 3, "D": 5}
second = {"A": 1, "C": 4, "D": 5, "E": 2}
third = {"A": 8, "C": 3, "D": 5, "E": 1}
shared_keys = first.keys() & second.keys() & third.keys()
from_first = {key: first[key] for key in shared_keys}
matching_pairs = dict(first.items() & second.items() & third.items())
print(from_first)
print(matching_pairs)
from_firstには、3つの辞書で共通するすべてのキーが含まれ、値にはfirstの値が使われます。matching_pairsには、3つすべてに共通する完全一致のペアだけが含まれます。複数の辞書をシーケンスにまとめている場合は、各辞書のキーを集合の引数として渡すことで、キーの演算をset.intersection()で表せます。辞書の結果が必要なら、その後に内包表記を使います。どちらの集合演算でも、キーはハッシュ可能でなければなりません。ペアの交差では値もハッシュ可能である必要があります。
必要な結果に合った交差方法を選ぶ
- 共通キーから新しい辞書を作り、値を選択または結合したい場合は、
key in otherを使う内包表記を選びます。 - キーと値のペア全体が一致する必要がある場合は、
dict.items()の集合交差を使います。ペアの両方の要素にハッシュ可能性が必要です。 - 共通キーだけが必要な場合は、
set.intersection()またはキーのビュー同士の交差を使います。結果は集合なので、必要に応じて別途辞書を作成してください。
これらの方法では、結果が何を表すかが明確になり、2つ以上の辞書に適用できます。残したいデータに応じて演算を選び、新しい辞書の値をどの辞書から取得するか決めましょう。