Python字典中的更新方法

时间:2013-07-09 11:49:33

标签: python dictionary

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

product.update(map(key, value))

product.update(key, value)

他们之间有什么区别?

2 个答案:

答案 0 :(得分:47)

不同之处在于第二种方法不起作用

>>> {}.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()期望值。

答案 1 :(得分:4)

  • Python 3.9和PEP 584引入了dict union,用于从另一个dict更新一个dict
    • Dict联合将返回一个新的dict,其中包括左操作数和右操作数的合并,每个操作数必须是dict(或dict的实例)子类)。如果两个操作数中都出现一个键,则最后出现的值(即来自右侧操作数的值)将获胜。
  • 请参阅SO: How do I merge two dictionaries in a single expression?以与新的扩充作业版本合并。
>>> 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)就地修改d1e = d1.copy(); e.update(d2)不是表达式,需要一个临时变量。

{**d1, **d2}

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