Python 比较两个字典的键/值并放入新字典

Python 比较两个字典的键/值并放入新字典,python,dictionary,dictionary-comprehension,Python,Dictionary,Dictionary Comprehension,我知道在这个问题上已经存在各种各样的问题,但我找不到一个完全符合我努力实现的目标的问题。我有以下代码,其中包括我从类似问题的解决方案中获得的解决方案: b = {"1":0,"2":0,"3":0,"4":0,"5":0} c = {"1":1,"4":4,"5":5} d = [k for k in b if c.get(k, object()) > b[k]] print d 我想要的是比较字典b和c的所有键和值对。如果c中缺少键和值对,则b的键/值保留在字典d中,否则c中的值保

我知道在这个问题上已经存在各种各样的问题,但我找不到一个完全符合我努力实现的目标的问题。我有以下代码,其中包括我从类似问题的解决方案中获得的解决方案:

b = {"1":0,"2":0,"3":0,"4":0,"5":0}
c = {"1":1,"4":4,"5":5}

d = [k for k in b if c.get(k, object()) > b[k]]

print d
我想要的是比较字典
b
c
的所有键和值对。如果
c
中缺少键和值对,则
b
的键/值保留在字典
d
中,否则
c
中的值保留在
d

在上面的示例中,
d
应如下所示:

d = {"1":1,"2":0,"3":0,"4":4,"5":5}
有人能告诉我行
d=
所需的正确语法吗


谢谢

您需要在理解中使用
if-else
条件,而且当一切都清楚时,您也不需要使用
get

>>> d={k:c[k] if k in c and c[k]>b[k] else v for k,v in b.items()}
>>> d
{'1': 1, '3': 0, '2': 0, '5': 5, '4': 4}
或许是这样:

b = {"1":0,"2":0,"3":0,"4":0,"5":0}
c = {"1":1,"4":4,"5":5}

d = {k:b[k] if not c.get(k)>b[k] else c[k] for k in b}

d
{'1': 1, '2': 0, '3': 0, '4': 4, '5': 5}
或者,如果要从
b
解包两个键/值以进行比较:

{k:v if not c.get(k)>v else c[k] for k, v in b.iteritems()}
只有当
k
c
中不存在且
c[k]
值为
v
时,才将k:v部分视为
key=k
,否则取
v


既然
c.get(k)
返回None如果
k
在c中不存在,那么
None>v
将自动转换为False

来回答您的实际问题

我想要的是比较字典b和c的所有键和值对。如果c中缺少键和值对,则b的键/对值保留在字典d中,否则c中的值保留在d中

在Python3中,您应该使用
collections.ChainMap
(注意这有点不同,它将从
c
中获取任何键,而不仅仅是
b
中的键)


您发布的代码将值
c[k]
b[k]
进行了比较,但您的描述仅提及当前值与缺失值,而不是“如果值较大,则仅使用
c
中的值”。如果
c[“4”]==-6
,您希望发生什么?
>>> b = {"1":0,"2":0,"3":0,"4":0,"5":0}
>>> c = {"1":1,"4":4,"5":5}
>>> d = {k: c.get(k, b[k]) for k in b}
>>> d
{'1': 1, '3': 0, '2': 0, '5': 5, '4': 4}
>>> from collections import ChainMap
>>> b = {"1":0,"2":0,"3":0,"4":0,"5":0}
>>> c = {"1":1,"4":4,"5":5}
>>> d = ChainMap(c, b)
>>> d
ChainMap({'1': 1, '5': 5, '4': 4}, {'1': 0, '3': 0, '2': 0, '5': 0, '4': 0})
>>> d['1'], d['2'], d['4']
(1, 0, 4)