[解決済み] 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"
に同じ辞書の値があれば、同じ結果になります。
関連
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] 辞書のリストを辞書の値でソートするにはどうしたらいいですか?
-
[解決済み] 2つのリストを辞書に変換するにはどうしたらいいですか?
-
[解決済み] 辞書のリストをpandasのDataFrameに変換する
-
[解決済み】forループを使った辞書の反復処理
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] tensorflowのCPUのみのインストールでダイナミックライブラリ 'cudart64_101.dll' を読み込めなかった
-
[解決済み] matplotlib でプロットの軸、目盛、ラベルの色を変更する方法
-
[解決済み] Pythonの辞書にあるスレッドセーフについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] DataFrameの文字列、dtypeがobjectの場合
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] 古いバージョンのPythonにおける辞書のキーの並び順
-
[解決済み] サブフォルダからのインポートモジュール
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
-
[解決済み] pycharmがタブをスペースに自動変換する
-
[解決済み] Pythonでファイルの読み込みと上書きをする
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法