Python中如何高效删除值完全被其他键的值包含的字典键值对
实现思路
要高效完成需求,核心是优先保留元素更多、包含独有元素的键值对,避免两两键对比的高复杂度:
- 先把每个键对应的列表转为集合,方便快速做子集判断和元素并集计算
- 按键对应集合的长度从大到小排序,同等长度下可自定义排序规则保证结果稳定
- 遍历排序后的键,只要当前键的集合有元素没有被已经保留的键的集合覆盖,就保留该键值对,同时更新覆盖的元素集合
- 完全被覆盖的键直接跳过即可
实现代码
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
相关产品推荐
相关产品推荐

