我有两本词典:
first = {"phone": {
"home": "(234) 442-4424"
},
"address":"xyz"
}
second = {"phone": {
"home": "(234) 442-4424",
"home1": "(234) 442-4424"
},
"address":{}
}
我希望首先合并两个字典超过第二个,这意味着第一个字典不会丢失其先前的值,只会将缺少的键值添加到第一个字典中。
最终字典应如下所示:
final = {"phone": {
"home": "(234) 442-4424",
"home1": "(234) 442-4424"
},
"address":"xyz"
}
如果我们使用如下字典列表,那该怎么办? -
first = {"phone": {
"home": "(234) 442-4424"
},
"address":[{"home":""},{"office":""}]
}
答案 0 :(得分:4)
second.update(first)
。两者中的任何键都将其值设置为first
中的值,而first
但second
中的任何键都将添加到second
。
答案 1 :(得分:1)
Update()
将起作用,只需复制第二个字典并应用第一个字典。所以第一个的价值将取代第二个而不是相反的方式。
first = {"phone": {"home": "(234) 442-4424"},"address":"xyz"}
second = {"phone": {"home": "(234) 442-5555","home1": "(234) 442-4424"},"address":{}}
# recursive deep update you can find here: http://stackoverflow.com/a/3233356/956660
import collections
def update(d, u):
for k, v in u.iteritems():
if isinstance(v, collections.Mapping):
r = update(d.get(k, {}), v)
d[k] = r
else:
d[k] = u[k]
return d
third = second.copy()
update(third, first)
print(third)
{'phone':{'home':'(234)442-4424','home1':'(234)442-4424'},'address':'xyz'}
答案 2 :(得分:0)
如果您只想将缺少的键/值对添加到第一个词典中,您只需将它们添加到第一个词典中,而不是创建新词典。
first = {}
second = {}
for key in second.keys():
if key not in first:
first[key] = second[key]
编辑:你的评论“它不适用于多级字典”
实际上,它将......技术上说。
first = {"Person1" : {"Age": "26", "Name": "Person1", "Phone number": "XXXXXX"}}
second = {"Person1": {"Interests": "fishing"}, "Person2": {"Age": "26", "Name": "Person2", "Phone number": "XXXXXX"}}
在这种情况下,first
dict将获取Person2
对象,但不会更改Person1
对象,因为它已经存在!
答案 3 :(得分:0)
假设您的 dictionnaries 具有以下结构:
假设要求是:
然后可能的代码是:
for k, v in first.iteritems():
if isinstance(v, str):
final[k] = v
elif k in final:
if isinstance(final[k], dict):
final[k].update(first[k])
else:
final[k] = first[k]
else:
final[k] = first[k]