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

解答:

对于字典xyz变成了浅层合并的字典,其值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中运行。例如教字典ag

<span style="color:var(--highlight-color)"><code>z = merge_dicts(a, b, c, d, e, f, g) 
</code></span>

在键值对g的优先级高于字典af,等等。

感谢各位大佬的观看

以上是关于Python练习题—如何在一个表达式中合并两个词典?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确编写涉及python词典的布尔表达式

如何在一个表达式中合并两个字典(取字典并集)?

合并两个词典相同的按键[复制]

python 合并词典

Python进行数组合并的方法

Leetcode练习(Python):链表类:第21题:合并两个有序链表:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。