31

我试图更新字典中的值,我遇到了两种方法:

product.update(map(key, value))

product.update(key, value)

它们之间有什么区别?

4

2 回答 2

53

不同的是,第二种方法不起作用

>>> {}.update(1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: update expected at most 1 arguments, got 2

dict.update()期望找到一个可迭代的键值对、关键字参数或另一个字典:

使用其他键/值对更新字典,覆盖现有键。返回None

update()接受另一个字典对象或键/值对的可迭代对象(作为元组或其他长度为 2 的可迭代对象)。如果指定了关键字参数,则字典将使用这些键/值对更新:d.update(red=1, blue=2).

map()是一种内置方法,它通过将第二个(和后续)参数的元素应用于第一个参数来生成序列,第一个参数必须是可调用的。除非您的key对象是可调用对象并且value对象是序列,否则您的第一个方法也会失败。

一个工作应用程序的演示map()

>>> def key(v):
...     return (v, v)
... 
>>> value = range(3)
>>> map(key, value)
[(0, 0), (1, 1), (2, 2)]
>>> product = {}
>>> product.update(map(key, value))
>>> product
{0: 0, 1: 1, 2: 2}

这里只生成满足预期map()的键值对。dict.update()

于 2013-07-09T11:54:17.317 回答
5
  • Python 3.9 和PEP 584引入了dict union, 用于dict从另一个更新dict.
    • Dict union 将返回一个新dict的由左操作数与右操作数合并组成的新值,每个操作数都必须是一个dict(或子类的实例dict)。如果一个键出现在两个操作数中,最后看到的值(即来自右侧操作数的值)获胜。
  • 请参阅SO:如何在一个表达式中合并两个字典?用于与新的增强分配版本合并。
>>> d = {'spam': 1, 'eggs': 2, 'cheese': 3}
>>> e = {'cheese': 'cheddar', 'aardvark': 'Ethel'}
>>> d | e
{'spam': 1, 'eggs': 2, 'cheese': 'cheddar', 'aardvark': 'Ethel'}
>>> e | d
{'aardvark': 'Ethel', 'spam': 1, 'eggs': 2, 'cheese': 3}

动机

当前合并两个字典的方法有几个缺点:

dict.update

d1.update(d2)d1就地修改。e = d1.copy(); e.update(d2)不是表达式,需要一个临时变量。

{**d1, **d2}

字典拆包看起来很丑,不容易被发现。很少有人能够在他们第一次看到它时猜出它的含义,或者将其视为合并两个 dicts 的“明显方式”。

于 2020-10-05T15:02:11.073 回答