-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

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

在上面的例子中d应该是这样的:

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

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

谢谢

4

3 回答 3

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)
于 2015-01-11T23:16:18.530 回答
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 中不存在则c.get(k)返回None ,并且会自动转换为FalsekNone > v

于 2015-01-11T21:23:26.733 回答
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}
于 2015-01-11T21:17:41.807 回答