Python: Dictionary merge by updating but not overwriting if value exists
如果我有两个口述如下:
1 2 | d1 = {('unit1','test1'):2,('unit1','test2'):4} d2 = {('unit1','test1'):2,('unit1','test2'):''} |
为了"合并"它们:
1 2 | z = dict(d1.items() + d2.items()) z = {('unit1','test1'):2,('unit1','test2'):''} |
工作良好。另外,如果我想比较两个字典的每个值,并且只在d1中的值为空/无/""时将d2更新为d1,该怎么办?
[编辑]问题:当将d2更新到d1时,当存在相同的键时,我只希望保持数值(从d1或d2开始)而不是空值。如果这两个值都为空,则维护空值没有问题。如果两者都有值,则d1值应保持不变。:)(如果没有,则为lotsa。同时我也会试试看)
即
1 2 3 4 5 6 | d1 = {('unit1','test1'):2,('unit1','test2'):8,('unit1','test3'):''} d2 = {('unit1','test1'):2,('unit1','test2'):'',('unit1','test3'):''} #compare & update codes z = {('unit1','test1'):2,('unit1','test2'):8, ('unit1','test2'):''} # 8 not overwritten by empty. |
请帮忙提出建议。
谢谢。
只需切换顺序:
1 | z = dict(d2.items() + d1.items()) |
顺便说一下,您可能对可能更快的
在Python3中,必须首先将视图对象强制转换为列表:
1 | z = dict(list(d2.items()) + list(d1.items())) |
如果需要特殊大小写空字符串,可以执行以下操作:
1 2 3 4 5 6 | def mergeDictsOverwriteEmpty(d1, d2): res = d2.copy() for k,v in d2.items(): if k not in d1 or d1[k] == '': res[k] = v return res |
Python 2.7。使用d1键/值对更新d2,但仅当d1值不是none时,""(false):
1 2 3 4 5 | >>> d1 = dict(a=1,b=None,c=2) >>> d2 = dict(a=None,b=2,c=1) >>> d2.update({k:v for k,v in d1.iteritems() if v}) >>> d2 {'a': 1, 'c': 2, 'b': 2} |
这是一个就地解决方案(它修改了d2):
1 2 3 4 5 6 7 8 9 | # assumptions: d2 is a temporary dict that can be discarded # d1 is a dict that must be modified in place # the modification is adding keys from d2 into d1 that do not exist in d1. def update_non_existing_inplace(original_dict, to_add): to_add.update(original_dict) # to_add now holds the"final result" (O(n)) original_dict.clear() # erase original_dict in-place (O(1)) original_dict.update(to_add) # original_dict now holds the"final result" (O(n)) return |
这是另一个就地解决方案,它不太优雅,但可能更高效,并且不修改D2:
1 2 3 4 5 6 7 8 | # assumptions: d2 is can not be modified # d1 is a dict that must be modified in place # the modification is adding keys from d2 into d1 that do not exist in d1. def update_non_existing_inplace(original_dict, to_add): for key in to_add.iterkeys(): if key not in original_dict: original_dict[key] = to_add[key] |
用
在不覆盖
1 2 3 | temp = d2.copy() d2.update(d1) d2.update(temp) |
如果字典的大小和键相同,可以使用以下代码:
1 | dict((k,v if k in d2 and d2[k] in [None, ''] else d2[k]) for k,v in d1.iteritems()) |