यह प्रश्न पुराना है, लेकिन मैं "गहरे मर्ज" समाधान की खोज करते समय यहां उतरा। ऊपर दिए गए उत्तर इस प्रकार हैं। मैंने अपना लेखन लिखना समाप्त कर दिया क्योंकि मेरे द्वारा परीक्षण किए गए सभी संस्करणों में बग थे। महत्वपूर्ण बिंदु याद किया गया था, दो इनपुट डिक्सेस की कुछ मनमानी गहराई पर, कुछ कुंजी के लिए, निर्णय वृक्ष, जब डी [के] या यू [के] एक तानाशाह नहीं था, दोषपूर्ण था।
इसके अलावा, इस समाधान में पुनरावृत्ति की आवश्यकता नहीं है, जो कि कैसे dict.update()
काम करता है और रिटर्न के साथ अधिक सममित है None
।
import collections
def deep_merge(d, u):
"""Do a deep merge of one dict into another.
This will update d with values in u, but will not delete keys in d
not found in u at some arbitrary depth of d. That is, u is deeply
merged into d.
Args -
d, u: dicts
Note: this is destructive to d, but not u.
Returns: None
"""
stack = [(d,u)]
while stack:
d,u = stack.pop(0)
for k,v in u.items():
if not isinstance(v, collections.Mapping):
# u[k] is not a dict, nothing to merge, so just set it,
# regardless if d[k] *was* a dict
d[k] = v
else:
# note: u[k] is a dict
# get d[k], defaulting to a dict, if it doesn't previously
# exist
dv = d.setdefault(k, {})
if not isinstance(dv, collections.Mapping):
# d[k] is not a dict, so just set it to u[k],
# overriding whatever it was
d[k] = v
else:
# both d[k] and u[k] are dicts, push them on the stack
# to merge
stack.append((dv, v))