为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕码人8056858 2021-03-21 16:17:37
我有两个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()我正在寻找的最后一个胜出的冲突处理方法也是如此。)
查看完整描述

3 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

在您的情况下,您可以执行以下操作:


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 | y

print(z)

{'a': 1, 'c': 11, 'b': 10}


查看完整回答
反对 回复 2021-03-22
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

这可能不是一个流行的答案,但是您几乎可以肯定不想这样做。如果要合并的副本,请使用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.484580039978027

IMO出于可读性考虑,前两者之间的微小速度下降是值得的。此外,仅在Python 2.3中添加了用于字典创建的关键字参数,而copy()和update()将在较早的版本中运行。


查看完整回答
反对 回复 2021-03-22
  • 3 回答
  • 0 关注
  • 231 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信