在 Python 2 中我可以执行以下操作:
>> d = {'a':1}
>> extras = [{'b':2}, {'c':4}]
>> map(d.update, extras)
>> d['c']
>> 4
在Python 3中得到一个KeyError
:
>> d = {'a':1}
>> extras = [{'b':2}, {'c':4}]
>> map(d.update, extras)
>> d['c']
>> KeyError: 'c'
我想在 Python 3 中实现与 Python 2 相同的行为。
据我所知,Python 3 中的映射将返回一个迭代器(惰性求值之类的),必须迭代该迭代器才能更新字典。
我原以为d['c']
键查找会以某种方式触发映射迭代,但事实并非如此。
有没有一种Python式的方法可以在不编写for循环的情况下实现这种行为,
与地图相比,我发现它很冗长。
我考虑过使用列表理解:
>> d = {'a':1}
>> extras = [{'b':2}, {'c':4}]
>> [x for x in map(d.update, extras)]
>> d['c']
>> 4
但它看起来并不像Pythonic。
正如你所注意到的,map
在Python 3中创建一个迭代器,它(本身)不会导致任何update
发生:
>>> d = {'a': 1}
>>> extras = [{'b':2}, {'c':4}]
>>> map(d.update, extras)
<map object at 0x105d73c18>
>>> d
{'a': 1}
为了强制map
要进行全面评估,您可以将其传递给list
明确地:
>>> list(map(d.update, extras))
[None, None]
>>> d
{'a': 1, 'b': 2, 'c': 4}
然而,正如相关部分Python 3 的新增功能 https://docs.python.org/3/whatsnew/3.0.html#views-and-iterators-instead-of-lists说:
特别棘手的是map()
因副作用而调用
功能;正确的转换是使用常规的for
环形
(因为创建列表只是浪费)。
在你的情况下,这看起来像:
for extra in extras:
d.update(extra)
这不会导致不必要的列表None
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)