比较两个字典的键,并创建一个包含键值对的字典,其中不匹配另一个字典中的键 - Python

3
我希望比较 dict_1dict_2 之间的键,并创建一个new_dict,其中只包含未匹配的键及其相应的值。我有两个这样的字典:
dict_1 = {'a':'1', 'b':'1', 'c': None}
dict_2 = {'d': '1', 'a': '2'}

我希望输出结果是这样的:aa 匹配,因此我希望它在 new_dict 中被排除。
new_dict = {'b':'1', 'c': None, 'd': '1'}

我尝试了这个:
new_dict = {}
for key in dict_1.items():
for key2 in dict_2.items():
    if key == key2:

但我不确定该如何从这里继续,或者也许这不是正确的做法。请帮忙!

2个回答

2
您可以对dict.keys的结果执行类似集合的操作:

对于类似集合的视图,所有在抽象基类collections.abc.Set中定义的操作都可用(例如==<^)。

因此,您可以像这样做:
dict_1 = {'a':'1', 'b':'1', 'c': None}
dict_2 = {'d': '1', 'a': '2'}

keys = dict_1.keys() ^ dict_2.keys()

new_dict = {k: dict_1.get(k, dict_2.get(k)) for k in keys}

0

您需要获取每个字典的键,并找到独特的键。我用集合实现了它。请看:

# your dictionaries
dict_1 = {'a':'1', 'b':'1', 'c': None}
dict_2 = {'d': '1', 'a': '2'}

# find their keys
dict_1_keys = set(dict_1.keys())
dict_2_keys = set(dict_2.keys())
# find unique keys
unique_keys = (dict_1_keys.union(dict_2_keys)) - (dict_1_keys.intersection(dict_2_keys))

dict_results = {}

for key in unique_keys:
    if dict_1.get(key) is not None:
        dict_results[key] = dict_1.get(key)
    else:
        dict_results[key] = dict_2.get(key)

print(dict_results)

1
你已经实现了集合的symmetric_difference,也就是^。你所做的操作在功能上没有问题,但是多余地重新发明了轮子。 - Mad Physicist
1
使用 if dict_1.get(key) is not None: 进行检查会得到错误的答案,因为其中一个字典包含有效的 None 值。请改用 if key in dict_1: - Mad Physicist
严格来说,None并不会导致错误,因为如果一个键在一个字典中存在,则它在另一个字典中不存在,因此在另一个字典上使用get将返回None,并且这是正确的值。但最好在逻辑上需要测试时编写key in dict_1;避免看似偶然成功的棘手代码。 - kaya3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接