如何高效移除嵌套字典中值小于同键其他值的键值对?
高效移除嵌套字典中值非全局最大的键值对
需求说明
移除嵌套字典中,值小于该键在其他子字典中对应值的键值对——仅保留每个全局键(如I1、I2)在所有子字典中的最大值对应的键值对。
示例输入
ex_dict = {'C1': {'I1': 1, 'I2': 1.5, 'I3': 2}, 'C2': {'I2': 2, 'I3': 3, 'I4': 3.5}, 'C3': {'I4': 2, 'I5': 4, 'I6': 3}, 'C4': {'I1': 2, 'I3': 3.5, 'I6': 5}, 'C5': {'I7': 1, 'I8': 1.5, 'I9': 2}}
期望输出
new_ex_dict = {'C1': {}, 'C2': {'I2': 2, 'I4': 3.5}, 'C3': {'I5': 4}, 'C4': {'I1': 2, 'I3': 3.5, 'I6': 5}, 'C5': {'I7': 1, 'I8': 1.5, 'I9': 2}}
高效实现方案
核心思路是先预计算所有全局键的最大值,再批量过滤子字典,避免重复遍历,将时间复杂度控制在线性级别。
步骤1:预计算全局键的最大值
遍历所有子字典,记录每个全局键对应的最大数值:
# 构建全局键-最大值映射 global_max = {} for sub_dict in ex_dict.values(): for key, val in sub_dict.items(): # 若键不存在或当前值更大,则更新最大值 if key not in global_max or val > global_max[key]: global_max[key] = val
步骤2:过滤子字典生成结果
遍历原嵌套字典,仅保留子字典中值等于对应全局最大值的键值对:
# 生成目标字典 new_ex_dict = { parent_key: { key: val for key, val in sub_dict.items() if val == global_max[key] } for parent_key, sub_dict in ex_dict.items() }
验证结果
执行代码后,打印new_ex_dict即可得到期望输出。
效率说明
该方案的时间复杂度为O(M),其中M是所有嵌套键值对的总数——仅需两次线性遍历:一次统计最大值,一次过滤子字典。相比每次检查键值对都遍历所有子字典的O(M*N)(N为父字典条目数),在数据规模较大时效率提升显著。
内容的提问来源于stack exchange,提问作者Erwin
相关产品推荐
相关产品推荐

