Max*_*Kim 27 python dictionary
我试图更新字典中的值,我遇到了两种方法:
product.update(map(key, value))
product.update(key, value)
Run Code Online (Sandbox Code Playgroud)
他们之间有什么区别?
Mar*_*ers 47
区别在于第二种方法不起作用:
>>> {}.update(1, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: update expected at most 1 arguments, got 2
Run Code Online (Sandbox Code Playgroud)
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}
Run Code Online (Sandbox Code Playgroud)
这里map()只生成满足dict.update()期望值的键值对.
dict union, 用于dict从另一个dict.
dict由左操作数与右操作数合并而成的,每个操作数都必须是一个dict(或dict子类的实例)。如果一个键出现在两个操作数中,则最后看到的值(即来自右侧操作数的值)获胜。>>> 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}
Run Code Online (Sandbox Code Playgroud)
当前合并两个字典的方法有几个缺点:
d1.update(d2)d1就地修改。e = d1.copy(); e.update(d2)不是表达式,需要一个临时变量。
字典解包看起来很丑,不容易发现。很少有人能够在他们第一次看到它时猜测它的含义,或者将其视为合并两个字典的“明显方式”。