2015-01-11 78 views
-1

我知道这个问题的变体已经存在,但我找不到与我正在尝试实现的变体完全匹配的变体。我有以下的代码,其中包括我从一个解决方案带到了一个类似的问题的解决方案:比较两个词典的关键字/值,并将其放入新词典

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 =,好吗?

感谢

+1

您发布的代码进行比较'[k]'用'b [k]'表示的值,但是你的描述只涉及当前与失踪,而不是“如果更大的话,只用'c'中的值。如果'c [“4”] == -6',你想要发生什么? – DSM

回答

0

您需要在您的理解为使用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} 
0

或许这样的:

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的部分:v被视为key=k,和value=v仅当k不存在在cc[k]值为>v,否则取v

而且由于c.get(k)回报如果k不存在C,和None > v会自动转化为

2

要回答你的实际问题

我想是到字典B的所有键和值对以与C比较。如果c中缺少一个键和值对,则b的键/值对保留在字典d中,否则c中的值将保留在d中。

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

在Python 3,你应该使用collections.ChainMap(注意,这是稍有不同,它会采取任意键从c,不只是在b的那些)

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