从另一个字典中删除一个字典 Python

4
如果A和B是两个字典,使用Python,有没有办法从字典A中删除在字典B中的元素?
例如:
parent_dict = {"a" : "aaa", "b" : "bbb", "c" : "ccc", "d" : "ddd", "e": "eee"}
derived_dict = {"a" : "aaa", "d" : "ddd", "e" : "eee"}

现在我需要编写一个函数dict_reduce(dictA, dictB),它可以从dictA中删除dictB的所有元素。
即,dict_reduce(parent_dict, derived_dict)应该返回{"b" : "bbb", "c" : "ccc"}。
我的解决方法是使用for循环:
def dict_reduce(parent_dict, child_dict):
    for key in child_dict.keys():
        del parent_dict[key]
    return parent_dict

reduced_dict = dict_reduce(parent_dict, child_dict)

注意:

  1. 如果解决方案是一行代码或者不需要使用for循环,那将会非常好。
  2. 我们无需在删除之前检查父字典是否有该键,因为子字典是从父字典派生而来的。所以不用考虑keyError。
  3. 父字典是一个静态字典,不应该受到该方法的影响。相反,返回的字典应该存储在另一个减少的字典中。
  4. 没有必要检查child_dict是否具有与parent_dict相同的键。只有键才重要。

3
你对使用 for 循环有什么意见?你的函数看起来非常清晰,一旦你写好了这个函数,每次使用它都只需要一行代码,并且也很易读。当一个三行函数能完成任务时,没有人会因编写过于聪明和晦涩难懂的代码而得到奖励。 - Duncan
你的“权宜之计”会影响到“parent_dict”,这是否是你想要的结果? - neurino
@Duncan,我使用for循环没有问题。但我的情况是要使用由rrd工具生成的字典。因此,我正在尝试减少for循环的数量。这需要大量时间来处理我的应用程序。如果有一种不需要for循环的解决方案,那么我肯定可以利用它。 - thiruvenkadam
@neurino 父字典不应受影响,因为它是整个代码中使用的字典。我会相应地更新我的问题。谢谢你指出来。 - thiruvenkadam
1
@thiruvenkadam:无论你最终使用的是mapfilter、列表推导式还是其他方法,即使你没有明确地写出来,你最终都会用到一个for循环。 - neurino
是的,我知道我们应该通过循环进行迭代...但是内联for循环或隐式for循环比显式for循环更快。由于提高我的应用程序性能是我的目标,所以我选择隐式for而不是显式for。 - thiruvenkadam
4个回答

12
{k: v for k, v in parent_dict.items() if k not in derived_dict}

1
删除具有不同值的重复键。 - agf
@DrTyrsa 很棒... 对我来说它像魔法一样运作良好。我可以轻松地将其分配给一个新的字典。 - thiruvenkadam

5
使用问题中提供的字典:
dict(parent_dict.items() - derived_dict.items()) 或
dict(parent_dict.items() ^ derived_dict.items())

2
在你的代码中添加一些上下文,以帮助未来的读者更好地理解它的含义。 - Grant Miller
由于作者不想改进:^ 运算符 = 在 dict1 中但不在 dict2 中的元素和在 dict2 中但不在 dict1 中的元素 - Jpsy

0
map(lambda k: del parent_dict[k], child_dict.keys())

1
del 是一个语句,不能放在 lambda 中。 - interjay
2
哎呀!那绝对是正确的。抱歉。今后请注意:在发布代码片段之前一定要进行测试,特别是当你正在使用不同的编程语言时! - deStrangis

0
如果你想影响父级字典,这段代码可以实现。
map(parent_dict.pop, filter(lambda k: k in derived_dict, parent_dict))

(并且还返回重复的键)

这个变体还会检查(如果需要)值是否匹配:

map(parent_dict.pop, filter(lambda k: k in derived_dict and derived_dict[k] == parent_dict[k], parent_dict))

父字典不应受到影响。我现在已经包含了注释和问题。感谢您指出它。 - thiruvenkadam

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