Python如何检测嵌套字典中子字典内与多数值不一致的异常值
嵌套字典异常值筛选实现方案
实现思路
基于你给出的前置条件(每个子字典中超半数的值相同),可以按以下逻辑实现:
- 遍历外层字典的每一个子字典节点
- 统计子字典所有值的出现频率,取最高频值作为基准正常值
- 遍历子字典的键值对,筛选出值不等于基准值的条目即为异常值
代码实现
方案1:使用collections.Counter(最简洁)
from collections import Counter my_dict = { 'k1': {'a': 11111, 'aa': 11111, 'b': 11111, 'bb': 11111, 'c': 11111, 'cc': 11111, 'd': 22222, 'dd': 22223, 'ee': 22222}, 'k2': {'f': 33333, 'g': 33333, 'h': 33333, 'i': 33333, 'j': 33333, 'k': 44443, 'l': 33334, 'm': 44443, 'n': 44443} } for outer_k, sub_dict in my_dict.items(): if not isinstance(sub_dict, dict): continue # 取出现频率最高的基准值 majority_val = Counter(sub_dict.values()).most_common(1)[0][0] # 筛选异常值 for inner_k, val in sub_dict.items(): if val != majority_val: print(f"异常条目:{outer_k}[{inner_k}] = {val}")
方案2:无额外依赖实现
利用「超半数的值相同,则排序后中间位置的值一定是基准值」的特性,无需导入第三方库:
for outer_k, sub_dict in my_dict.items(): if not isinstance(sub_dict, dict): continue # 排序后取中间值作为基准 sorted_vals = sorted(sub_dict.values()) majority_val = sorted_vals[len(sorted_vals) // 2] # 筛选异常值 for inner_k, val in sub_dict.items(): if val != majority_val: print(f"异常条目:{outer_k}[{inner_k}] = {val}")
运行结果示例
异常条目:k1[d] = 22222 异常条目:k1[dd] = 22223 异常条目:k1[ee] = 22222 异常条目:k2[k] = 44443 异常条目:k2[l] = 33334 异常条目:k2[m] = 44443 异常条目:k2[n] = 44443
内容的提问来源于stack exchange,提问作者psagrera
相关产品推荐
相关产品推荐

