合并两个词典并保留第一个词典的值

时间:2015-11-25 09:27:37

标签: python dictionary

我有两本词典:

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":""}]
            }

4 个答案:

答案 0 :(得分:4)

second.update(first)。两者中的任何键都将其值设置为first中的值,而firstsecond中的任何键都将添加到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 具有以下结构:

  • 每个元素都是一个字典
  • 值可以是普通字符串或字典

假设要求是:

  • 如果某个键只存在于要合并的2个元素之一中,请保留其值
  • 如果两个元素中都存在键:
    • 如果第一个元素中的值是普通字符串,请保持其值
    • 如果第一个元素中的值是dict,而second中的值是一个字符串,请保留第一个值
    • 如果两个元素中的值都是dict,则优先将它们合并为第一个

然后可能的代码是:

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]