Python:如果存在值,则通过更新而不是覆盖来进行字典合并
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python:如果存在值,则通过更新而不是覆盖来进行字典合并相关的知识,希望对你有一定的参考价值。
如果我有2个dicts如下:
d1 = {('unit1','test1'):2,('unit1','test2'):4}
d2 = {('unit1','test1'):2,('unit1','test2'):''}
为了“合并”它们:
z = dict(d1.items() + d2.items())
z = {('unit1','test1'):2,('unit1','test2'):''}
工作良好。另外要做什么,如果我想比较两个词典的每个值,如果d1中的值为空/无/',则只将d2更新为d1?
[编辑]问题:当将d2更新为d1时,当存在相同的键时,我只想保持数值(来自d1或d2)而不是空值。如果两个值都为空,那么保持空值没有问题。如果两者都有值,则应保留d1值。 :)(lota if-else ..我会在此期间尝试自己)
即
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.
请帮忙建议。
谢谢。
答案
只需切换订单:
z = dict(d2.items() + d1.items())
顺便说一句,您可能也对可能更快的update
方法感兴趣。
在Python 3中,您必须首先将视图对象强制转换为列表:
z = dict(list(d2.items()) + list(d1.items()))
如果您想要特殊情况下的空字符串,可以执行以下操作:
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):
>>> 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.update(d1)
而不是dict(d2.items() + d1.items())
另一答案
这是一个就地解决方案(它修改了d2):
# 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:
# 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]
另一答案
要添加d2
中的d1
键/值,这些键/值在d2
中不存在而不覆盖d2
中的任何现有键/值:
temp = d2.copy()
d2.update(d1)
d2.update(temp)
另一答案
如果您有相同大小和键的字典,您可以使用以下代码:
dict((k,v if k in d2 and d2[k] in [None, ''] else d2[k]) for k,v in d1.iteritems())
以上是关于Python:如果存在值,则通过更新而不是覆盖来进行字典合并的主要内容,如果未能解决你的问题,请参考以下文章