You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何高效删除值完全被其他键的值包含的字典键值对

实现思路

要高效完成需求,核心是优先保留元素更多、包含独有元素的键值对,避免两两键对比的高复杂度:

  1. 先把每个键对应的列表转为集合,方便快速做子集判断和元素并集计算
  2. 按键对应集合的长度从大到小排序,同等长度下可自定义排序规则保证结果稳定
  3. 遍历排序后的键,只要当前键的集合有元素没有被已经保留的键的集合覆盖,就保留该键值对,同时更新覆盖的元素集合
  4. 完全被覆盖的键直接跳过即可

实现代码

dictionary = {"first":["a", "b", "c"], 
              "second":["a", "c", "d", "b", "e"], 
              "third":["a", "e", "f"], 
              "four":["f", "b", "c"],
              "five":["b", "e", "g"]}

# 预生成每个键对应的集合
key_sets = {k: set(v) for k, v in dictionary.items()}
# 按集合长度降序排序,长度相同则按键名升序排序,保证结果稳定
sorted_keys = sorted(dictionary.keys(), key=lambda k: (-len(key_sets[k]), k))

covered = set()
new_dictionary = {}

for k in sorted_keys:
    current_set = key_sets[k]
    # 当前集合存在未被覆盖的元素则保留
    if not current_set.issubset(covered):
        new_dictionary[k] = dictionary[k]
        covered.update(current_set)

print(new_dictionary)

输出结果

运行上述代码即可得到预期结果:

{'second': ['a', 'c', 'd', 'b', 'e'], 'third': ['a', 'e', 'f'], 'five': ['b', 'e', 'g']}

效率说明

该方案整体时间复杂度为O(n log n + m),其中n为字典键的数量,m为所有值列表的总元素数,远优于两两键对比的O(n²)方案,键越多性能优势越明显。如果需要调整同等长度下的保留优先级,修改sorted函数的key参数即可。

内容的提问来源于stack exchange,提问作者Tim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:30:04