1. ホーム
  2. python

[解決済み] 2つの辞書を交差させる

2023-04-13 17:15:14

質問

転置インデックスを対象とした検索プログラムを作成しています。インデックス自体は、キーが用語で、値が短い文書の辞書で、キーがID番号、値がテキストコンテンツです。

2 つの用語の「AND」検索を実行するには、このように私はそれらの投稿リスト (辞書) を交差させる必要があります。Python でこれを行うための明確な (必ずしも過度に巧妙ではない) 方法は何でしょうか。私はまず、長い道のりを使って iter :

p1 = index[term1]  
p2 = index[term2]
i1 = iter(p1)
i2 = iter(p2)
while ...  # not sure of the 'iter != end 'syntax in this case
...

どのように解決するのですか?

一般に、Pythonで辞書の交点を構成するためには、最初に & 演算子 を使って、辞書のキーの集合の交わりを計算します ( 辞書のキーは集合のようなオブジェクト のようなものです)。

dict_a = {"a": 1, "b": 2}
dict_b = {"a": 2, "c": 3} 

intersection = dict_a.keys() & dict_b.keys()  # {'a'}

Python 2では、辞書のキーを自分でセットに変換する必要があります。

keys_a = set(dict_a.keys())
keys_b = set(dict_b.keys())
intersection = keys_a & keys_b

そして、キーの交差点が与えられれば、あとは好きなように値の交差点を構築することができます。集合の交差の概念は、関連する値が異なる場合にどうすればよいかを教えてくれないので、ここで選択しなければなりません。(おそらく、このために & の交差演算子がPythonの辞書に対して直接定義されていないのはこのためと思われます)。

この場合、同じキーに対する値は等しくなるようなので、どちらかの辞書から値を選べばよいでしょう。

dict_of_dicts_a = {"a": {"x":1}, "b": {"y":3}}
dict_of_dicts_b = {"a": {"x":1}, "c": {"z":4}} 

shared_keys = dict_of_dicts_a.keys() & dict_of_dicts_b.keys()

# values equal so choose values from a:
dict_intersection = {k: dict_of_dicts_a[k] for k in shared_keys }  # {"a":{"x":1}}

値を結合する他の合理的な方法は、辞書の値の型と、それらが何を表すかに依存します。例えば、辞書の辞書の共有キーの値の結合が必要かもしれない。辞書の和は値に依存しないので、よく定義されており、pythonでは | 演算子を使って取得できます。

# union of values for each key in the intersection:
dict_intersection_2 = { k: dict_of_dicts_a[k] | dict_of_dicts_b[k] for k in shared_keys }

この場合、キーに同一の辞書値を持つ "a" に同じ辞書の値があれば、同じ結果になります。