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:如果存在值,则通过更新而不是覆盖来进行字典合并的主要内容,如果未能解决你的问题,请参考以下文章

如果值与预期不同,则查找文件类型并验证是不是存在替换行

如果选择标题而不是值,则 Breeze/Knockout 下拉值不会在数据库中更新

如果 Oracle 中存在行值,则使用随机值更新行

检查值是不是存在的数组列表,如果存在则将 1 添加到字符串

python文件和数据格式化

如果已经存在该文件,则 Python 程序在覆盖时重命名文件名