使用公共/重叠键合并嵌套词典

时间:2018-03-20 10:12:12

标签: python dictionary

我有两个字典,我想将两个字典合并为一个。

如何有效地合并它们?

Dict1

{
    UUID('id1'): {
        'due': datetime.date(2018, 3, 10),
        'status': 'Done',
    }, UUID('id2'): {
        'due_date': datetime.date(2018, 3, 10),
        'old_status': 'Done',
    }
}

Dict2

{
    UUID('id1'): {
        'new_val': 'Pass',
        'amount': 123.0,
    }, UUID('id2'): {
        'new_val': 'Fail',
        'amount': 0,
    }
}

所需输出

{
    UUID('id1'): {
        'due': datetime.date(2018, 3, 10),
        'status': 'Done',
        'new_val': 'Pass',
        'amount': 123.0,
    }, UUID('id2'): {
        'due_date': datetime.date(2018, 3, 10),
        'old_status': 'Done',
        'new_val': 'Fail',
        'amount': 0,
    }
}

3 个答案:

答案 0 :(得分:1)

您可以使用**解压缩符号和dict.get默认参数{}来组合您的词典。

这将处理一个字典中的键不在另一个字典中的情况,并允许我们迭代所有键的并集。

keys = d1.keys() | d2.keys()

res = {k: {**d1.get(k, {}), **d2.get(k, {})} for k in keys}

<强>结果

{'id1': {'amount': 123.0,
  'due': datetime.date(2018, 3, 10),
  'new_val': 'Pass',
  'status': 'Done'},
 'id2': {'amount': 0,
  'due_date': datetime.date(2018, 3, 10),
  'new_val': 'Fail',
  'old_status': 'Done'}}

<强>设置

import datetime

d1 = {
    'id1': {
        'due': datetime.date(2018, 3, 10),
        'status': 'Done',
    }, 'id2': {
        'due_date': datetime.date(2018, 3, 10),
        'old_status': 'Done',
    }
}

d2 = {
    'id1': {
        'new_val': 'Pass',
        'amount': 123.0,
    }, 'id2': {
        'new_val': 'Fail',
        'amount': 0,
    }
}

答案 1 :(得分:0)

对于字典xyz成为合并字典,y中的值将替换x中的值。

在Python 3.5或更高版本中,:

z = {**x, **y}

在Python 2中,(或3.4或更低版本)编写一个函数:

def merge_two_dicts(x, y):
     z = x.copy()   # start with x's keys and values
     z.update(y)    # modifies z with y's keys and values & returns None
     return z

z = merge_two_dicts(x, y)

答案 2 :(得分:0)

Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
    ... 28 more
Caused by: org.springframework.web.client.HttpClientErrorException: 401 null
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:85)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:707)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:660)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:620)
    at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:414)
    at hew.presentation.service.UserService.login(UserService.java:30)
    at hew.presentation.controller.LoginController.handleSignIn(LoginController.java:56)
    ... 38 more

输出

dict1={
    'UUID(id1)': {
        'due': 'datetime.date(2018, 3, 10)',
        'status': 'Done'
    }, 'UUID(id2)': {
        'due_date': 'datetime.date(2018, 3, 10)',
        'old_status': 'Done'
    }
}
dict2={'UUID(id1)':{
        'new_val': 'Pass',
        'amount': 123.0

}, 
        'UUID(id2)': {
        'new_val': 'Fail',
        'amount': 0
    }
}
finaldict = {key:(dict1[key], dict2[key]) for key in dict1}
print(finaldict)