Python练习题—如何在一个表达式中合并两个词典?
Posted 日常分享Python
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python练习题—如何在一个表达式中合并两个词典?相关的知识,希望对你有一定的参考价值。
我有两个Python字典,我想编写一个返回这两个字典(合并后即合并)的单个表达式。该update()
方法将是我需要的,如果它返回了结果而不是就地修改字典。
>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 10, 'c': 11}
>>> z = x.update(y)
>>> print(z)
None
>>> x
{'a': 1, 'b': 10, 'c': 11}
我怎样才能在最终的合并字典z
,不是x
?
解答:
对于字典x
和y
,z
变成了浅层合并的字典,其值y
替换了的值x
。
-
在Python 3.9.0或更高(释放2020年10月17日):PEP-584,在这里讨论,被实现,并且提供了最简单的方法:
<span style="color:var(--highlight-color)"><code>z = x | y # NOTE: 3.9+ ONLY </code></span>
-
在Python 3.5或更高版本中:
<span style="color:var(--highlight-color)"><code>z = {**x, **y} </code></span>
-
在Python 2(或3.4或更低版本)中,编写一个函数:
<span style="color:var(--highlight-color)"><code>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 </code></span>
现在:
<span style="color:var(--highlight-color)"><code>z = merge_two_dicts(x, y) </code></span>
解释
假设您有两个字典,并且想要将它们合并为一个新字典,而无需更改原始字典:
<span style="color:var(--highlight-color)"><code>x = {'a': 1, 'b': 2}
y = {'b': 3, 'c': 4}
</code></span>
理想的结果是获得一个z
合并了值的新字典(),第二个字典的值覆盖第一个字典的值。
<span style="color:var(--highlight-color)"><code>>>> z
{'a': 1, 'b': 3, 'c': 4}
</code></span>
在PEP 448中提出并从Python 3.5开始可用的新语法是
<span style="color:var(--highlight-color)"><code>z = {**x, **y}
</code></span>
而且确实是一个单一的表达。
请注意,我们也可以使用文字符号合并:
<span style="color:var(--highlight-color)"><code>z = {**x, 'foo': 1, 'bar': 2, **y}
</code></span>
现在:
<span style="color:var(--highlight-color)"><code>>>> z
{'a': 1, 'b': 3, 'foo': 1, 'bar': 2, 'c': 4}
</code></span>
它现在显示为在3.5的发布时间表中实现,PEP 478,并且已进入Python 3.5的新功能文档中。
但是,由于许多组织仍在使用Python 2,因此您可能希望以向后兼容的方式进行操作。在Python 2和Python 3.0-3.4中可用的经典Pythonic方法是分两个步骤完成的:
<span style="color:var(--highlight-color)"><code>z = x.copy()
z.update(y) # which returns None since it mutates z
</code></span>
在这两种方法中,y
将排第二,其值将替换x
的值,因此'b'
将指向3
我们的最终结果。
尚未在Python 3.5上运行,但需要一个表达式
如果您尚未使用Python 3.5或需要编写向后兼容的代码,并且希望在单个表达式中使用它,则最有效的方法是将其放入函数中:
<span style="color:var(--highlight-color)"><code>def merge_two_dicts(x, y):
"""Given two dictionaries, merge them into a new dict as a shallow copy."""
z = x.copy()
z.update(y)
return z
</code></span>
然后您有一个表达式:
<span style="color:var(--highlight-color)"><code>z = merge_two_dicts(x, y)
</code></span>
您还可以创建一个函数来合并未定义数量的字典,字典的数量从零到很大:
<span style="color:var(--highlight-color)"><code>def merge_dicts(*dict_args):
"""
Given any number of dictionaries, shallow copy and merge into a new dict,
precedence goes to key-value pairs in latter dictionaries.
"""
result = {}
for dictionary in dict_args:
result.update(dictionary)
return result
</code></span>
此函数将在所有字典的Python 2和3中运行。例如教字典a
到g
:
<span style="color:var(--highlight-color)"><code>z = merge_dicts(a, b, c, d, e, f, g)
</code></span>
在键值对g
的优先级高于字典a
来f
,等等。
感谢各位大佬的观看
以上是关于Python练习题—如何在一个表达式中合并两个词典?的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode练习(Python):链表类:第21题:合并两个有序链表:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。