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

时间:2015-01-11 21:12:49

标签: 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中的值将保留在d中{1}}。

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

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

有人能告诉我行d =所需的正确语法吗?

由于

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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}

答案 2 :(得分: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)返回,如果c中不存在kNone > v将自动转换为 False