[解決済み] 辞書の辞書をマージする方法は?
2022-04-15 10:16:10
質問
複数の辞書をマージする必要があるのですが、例えばこんな感じです。
dict1 = {1:{"a":{A}}, 2:{"b":{B}}}
dict2 = {2:{"c":{C}}, 3:{"d":{D}}
と
A
B
C
と
D
のように、木の葉になっています。
{"info1":"value", "info2":"value2"}
辞書のレベル(深さ)は未知数であり、以下のようになります。
{2:{"c":{"z":{"y":{C}}}}}
私の場合は、ノードがdocs、リーフがfilesのディレクトリ/ファイル構造を表しています。
それらをマージして取得したい。
dict3 = {1:{"a":{A}}, 2:{"b":{B},"c":{C}}, 3:{"d":{D}}}
Pythonでどうやったら簡単にできるのか、よくわからない。
どのように解決するのですか?
特に、重複しているが一貫性のあるエントリーを正しく受け入れながら、一貫性がない場合に有用なエラーメッセージを表示したい場合です (他の回答にはありません...)。
膨大な数のエントリーがないと仮定すれば、再帰的な関数が最も簡単です。
def merge(a, b, path=None):
"merges b into a"
if path is None: path = []
for key in b:
if key in a:
if isinstance(a[key], dict) and isinstance(b[key], dict):
merge(a[key], b[key], path + [str(key)])
elif a[key] == b[key]:
pass # same leaf value
else:
raise Exception('Conflict at %s' % '.'.join(path + [str(key)]))
else:
a[key] = b[key]
return a
# works
print(merge({1:{"a":"A"},2:{"b":"B"}}, {2:{"c":"C"},3:{"d":"D"}}))
# has conflict
merge({1:{"a":"A"},2:{"b":"B"}}, {1:{"a":"A"},2:{"b":"C"}})
を変異させることに注意してください。
a
- の内容は
b
に追加されます。
a
(も返されます)。もし
a
のように呼び出すことができます。
merge(dict(a), b)
.
agf さんは、2 つ以上のディクショ ンを持つ可能性があることを (以下で) 指摘していますが、その場合は、これを使うことができます。
reduce(merge, [dict1, dict2, dict3...])
に追加されます。
dict1
.
備考 : 最初の回答を編集して、最初の引数をミューティングするようにしました。
PS
: Python 3 では、以下のものも必要です。
from functools import reduce
関連
-
PythonによるLeNetネットワークモデルの学習と予測
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] 辞書を繰り返し使用するには?
-
[解決済み] 辞書のリストを辞書の値でソートするにはどうしたらいいですか?
-
[解決済み] 2 つの Git リポジトリをマージする方法は?
-
[解決済み】forループを使った辞書の反復処理
-
[解決済み】JavaScriptで2つの配列を結合し、項目の重複を排除する方法
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
Python Decorator 練習問題
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み] [Solved] sklearn error ValueError: 入力に NaN、infinity または dtype('float64') に対して大きすぎる値が含まれている。
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み】Django: ImproperlyConfigured: SECRET_KEY 設定は空であってはならない
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み】Python elifの構文が無効です【終了しました
-
[解決済み】 TypeError: += でサポートされていないオペランド型: 'int' および 'list' です。
-
[解決済み】ValueError: xとyは同じサイズでなければならない