Python 字典过滤:移除字典A中所有在B的键值集合内出现过的数值
字典数字过滤实现方案
现有写法问题分析
- 第一种推导式
C = {k: v for k, v in A.items() if k not in B}:in操作符作用于字典时仅检索键,既没有覆盖B的值,也没有处理A的值的过滤逻辑,结果不符合预期。 - 第二种
C = dict(A.items() - B.items()):该操作是求两个字典键值对的差集,和全局数字过滤的需求完全不匹配。
正确实现逻辑
- 提取B中所有出现过的数字(包含所有键、所有值,去重形成集合)
- 提取A中所有出现过的数字(包含所有键、所有值,去重形成集合)
- 用A的数字集合减去B的数字集合,剩余元素即为符合要求的结果
完整可运行代码
# 原始字典定义 A = {1: 27, 3: 41, 7: 26, 11: 32, 12: 23, 14: 23, 15: 37, 18: 27, 21: 35, 23: 12, 25: 33, 26: 7, 27: 1, 29: 14, 32: 11, 33: 25, 35: 21, 36: 27, 37: 15, 38: 25, 39: 23, 41: 3, 44: 27} B = {1: 27, 3: 41, 7: 26, 11: 32, 12: 23, 15: 37, 18: 27, 21: 35, 26: 7, 29: 14, 32: 11, 33: 25, 35: 21, 36: 27, 39: 23, 41: 3, 44: 27} # 合并B的所有键、值,去重得到待过滤的数字集合 b_occurred = set(B) | set(B.values()) # 合并A的所有键、值,剔除B中已存在的数字 result = (set(A) | set(A.values())) - b_occurred # 输出集合形式结果:{38} print(result) # 若需直接取出单个值(本例仅1个元素),输出:38 print(next(iter(result)))
若需求为过滤字典A本身,仅保留键和值都不在B的出现集合内的条目,可使用如下写法:
filtered_A = {k: v for k, v in A.items() if k not in b_occurred and v not in b_occurred} # 本例中所有A的键、值都属于b_occurred,最终得到空字典
内容的提问来源于stack exchange,提问作者Sayanta Seth
相关产品推荐
相关产品推荐

