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

我有两个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?


(更明确地说,dict.update()我正在寻找的最后一个胜出的冲突处理方法也是如此。)


慕码人8056858
浏览 232回答 3
3回答

慕斯王

在您的情况下,您可以执行以下操作:z = dict(list(x.items()) + list(y.items()))可以根据需要将最终的dict放入中z,并b用第二个(y)dict的值正确覆盖key的值:>>> x = {'a':1, 'b': 2}>>> y = {'b':10, 'c': 11}>>> z = dict(list(x.items()) + list(y.items()))>>> z{'a': 1, 'c': 11, 'b': 10}如果使用Python 2,甚至可以删除list()调用。要创建z:>>> z = dict(x.items() + y.items())>>> z{'a': 1, 'c': 11, 'b': 10}如果您使用Python版本3.9.0a4或更高版本,则可以直接使用:x = {'a':1, 'b': 2}y = {'b':10, 'c': 11}z = x | yprint(z){'a': 1, 'c': 11, 'b': 10}

幕布斯6054654

这可能不是一个流行的答案,但是您几乎可以肯定不想这样做。如果要合并的副本,请使用copy(或deepcopy,具体取决于您的需求),然后进行更新。与使用.items()+ .items()进行单行创建相比,两行代码更具可读性-更具Python风格。显式胜于隐式。此外,当您使用.items()(Python 3.0之前的版本)时,您正在创建一个新列表,其中包含字典中的项目。如果您的词典很大,那将是很多开销(创建合并字典后将立即丢弃两个大列表)。update()可以更高效地工作,因为它可以逐项执行第二个字典。在时间方面:>>> timeit.Timer("dict(x, **y)", "x = dict(zip(range(1000), range(1000)))\ny=dict(zip(range(1000,2000), range(1000,2000)))").timeit(100000)15.52571702003479>>> timeit.Timer("temp = x.copy()\ntemp.update(y)", "x = dict(zip(range(1000), range(1000)))\ny=dict(zip(range(1000,2000), range(1000,2000)))").timeit(100000)15.694622993469238>>> timeit.Timer("dict(x.items() + y.items())", "x = dict(zip(range(1000), range(1000)))\ny=dict(zip(range(1000,2000), range(1000,2000)))").timeit(100000)41.484580039978027IMO出于可读性考虑,前两者之间的微小速度下降是值得的。此外,仅在Python 2.3中添加了用于字典创建的关键字参数,而copy()和update()将在较早的版本中运行。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python