如果值存在,则通过更新但不覆盖来合并字典
如果我有 2 个字典,如下所示:
d1 = {'a': 2, 'b': 4}
d2 = {'a': 2, 'b': ''}
为了“合并”它们:
dict(d1.items() + d2.items())
结果是
{'a': 2, 'b': ''}
但是如果我想比较两个字典的每个值并且只将 d2
更新为 ,我该怎么办d1
如果 d1
中的值为空/None
/''
?
当存在相同的键时,我只想保留数值(来自 d1
或 d2
)而不是空值。如果两个值都为空,则保持空值没有问题。如果两者都有值,则应保留 d1-value。
ie
d1 = {'a': 2, 'b': 8, 'c': ''}
d2 = {'a': 2, 'b': '', 'c': ''}
应该导致
{'a': 2, 'b': 8, 'c': ''}
8 不被 ''
覆盖。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
只需切换顺序:
顺便说一句,您可能还对可能更快的 <代码>更新方法。
在Python 3中,您必须首先将视图对象转换为列表:
如果您想要特殊情况的空字符串,您可以执行以下操作:
Just switch the order:
By the way, you may also be interested in the potentially faster
update
method.In Python 3, you have to cast the view objects to lists first:
If you want to special-case empty strings, you can do the following:
使用
d1
键/值对更新d2
,但前提是d1
值不为None
,' '
(False):(在 Python 2 中使用
iteritems()
而不是items()
。)Updates
d2
withd1
key/value pairs, but only ifd1
value is notNone
,''
(False):(Use
iteritems()
instead ofitems()
in Python 2.)Python 3.5+ Literal Dict
除非使用过时版本的 python,否则最好使用它。
Pythonic 和字典解包的更快方法:
它比 dict(list(d2.items()) + list(d1.items())) 更简单,也更快 替代方案:
更多信息来自 PEP448:
仅合并非零值
要执行此操作,我们只需创建一个不带空值的字典,然后以这种方式将它们合并在一起:
outputs:
a
->更喜欢 d1 中的第一个值,因为 d1 和 d2 上都存在“a”b
->仅存在于 d1c
-> d2d
上非零解释
上面的代码将使用 dict 理解创建一个字典。
如果
d1
具有该值及其非零值(即bool(val)为True
),它将使用d1[k]
值,否则需要d2[k]
。请注意,我们还合并了两个字典的所有键,因为它们可能不具有完全相同的键,使用 set union -
set(d1) |设置(d2)。
Python 3.5+ Literal Dict
unless using obsolete version of python you better off using this.
Pythonic & faster way for dict unpacking:
its simpler and also faster than the
dict(list(d2.items()) + list(d1.items()))
alternative:more on this from PEP448:
Merging Only Non-zero values
to do this we can just create a dict without the empty values and then merge them together this way:
outputs:
a
-> prefer first value from d1 as 'a' exists on both d1 and d2b
-> only exists on d1c
-> non-zero on d2d
-> empty string on bothExplanation
The above code will create a dictionary using dict comprehension.
if
d1
has the value and its non-zero value (i.e.bool(val) is True
), it'll used1[k]
value, otherwise it'll taked2[k]
.notice that we also merge all keys of the two dicts as they may not have the exact same keys using set union -
set(d1) | set(d2)
.将
d1
中不存在于d2
中的键/值添加到d2
中,而不覆盖d2
中的任何现有键/值代码>:To add to
d2
keys/values fromd1
which do not exist ind2
without overwriting any existing keys/values ind2
:这是一个就地解决方案(它修改了 d2):
这是另一个就地解决方案,它不太优雅,但可能更高效,并且离开 d2未修改:
Here's an in-place solution (it modifies d2):
Here's another in-place solution, which is less elegant but potentially more efficient, as well as leaving d2 unmodified:
d2.update(d1)
而不是dict(d2.items() + d1.items())
d2.update(d1)
instead ofdict(d2.items() + d1.items())
如果您有相同大小和键的字典,您可以使用以下代码:
In case when you have dictionaries with the same size and keys you can use the following code:
如果您想忽略空格,例如合并:
结果为:
{'a': 'aaa', 'b': 4, 'c': 5, 'w': ''}
您可以使用这两个函数:
因此您可以使用
merge_multiple_dicts(a,b,c,d)
If you want to ignore empty spaces so that for example merging:
results in:
{'a': 'aaa', 'b': 4, 'c': 5, 'w': ''}
You can use these 2 functions:
So you can just use
merge_multiple_dicts(a,b,c,d)
如果您想更自由地选择何时应在合并字典中覆盖某个值,我有一个解决方案。也许这是一个冗长的脚本,但不难理解其逻辑。
感谢 fabiocaccamo 和 senderle 分享 benedict 包< /a> 和列表中的嵌套迭代逻辑。这些知识是脚本开发的基础。
Python 要求
Python 脚本
Dict
类的定义。定义
main
方法以显示示例。输出
I have a solution if you want to have more freedom to choose when a value should be overwritten in the merged dictionary. Maybe it's a verbose script, but it's not hard to understand its logic.
Thanks fabiocaccamo and senderle for sharing the benedict package, and the nested iteration logic in lists, respectively. This knowledge was fundamental to the script development.
Python Requirements
Python Script
Definition of the
Dict
class.Definition of the
main
method to show examples.Output