比较两个词典的 key/values 并放入新词典
Compare the key/values of two dictionaries and put into new dictionary
我知道这个问题的变体已经存在,但我找不到与我想要达到的目标完全匹配的变体。我有以下代码,其中包括我从类似问题的解决方案中获取的解决方案:
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
的 key/pair 值将保留在字典 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
中解压两个 key/values 进行比较:
{k:v if not c.get(k)>v else c[k] for k, v in b.iteritems()}
k:v的部分被视为key=k
,value=
v
仅当k
不被处理' t存在于c
和c[k]
中取值为>
v
,否则取v
。
并且由于 c.get(k)
returns None 如果 k
在 c 中不存在,并且 None > v
将自动转换为 False.
回答您的实际问题
What I want is to compare all the key and value pairs of the dictionary b with those of c. If a key and value pair is missing from c then the key/pair value of b is retained in the dictionary d, else the values in c are retained in 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)
我知道这个问题的变体已经存在,但我找不到与我想要达到的目标完全匹配的变体。我有以下代码,其中包括我从类似问题的解决方案中获取的解决方案:
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
的 key/pair 值将保留在字典 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
中解压两个 key/values 进行比较:
{k:v if not c.get(k)>v else c[k] for k, v in b.iteritems()}
k:v的部分被视为key=k
,value=
v
仅当k
不被处理' t存在于c
和c[k]
中取值为>
v
,否则取v
。
并且由于 c.get(k)
returns None 如果 k
在 c 中不存在,并且 None > v
将自动转换为 False.
回答您的实际问题
What I want is to compare all the key and value pairs of the dictionary b with those of c. If a key and value pair is missing from c then the key/pair value of b is retained in the dictionary d, else the values in c are retained in 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)