基于分数去除字典中冗余元组的高效实现方法
解决字典冗余元组的高效方法
要实现这个需求,核心思路是先全局记录每个词的最高分数,再过滤掉分数低于最高值的项。必须遍历所有元组,但这个过程是线性的,效率很高,属于最优解法,具体步骤如下:
步骤1:收集所有词的最高分数
首先遍历整个嵌套字典的所有元组,用一个字典记录每个词对应的最高分数。这一步是必要的——你得先知道每个词的最高分,才能判断哪些元组要删除。
代码实现:
a = { 'trans': [('pickup', 1.0), ('boat', 1.0), ('plane', 1.0), ('walking', 1.0), ('foot', 1.0), ('train', 0.7455259731472191), ('trailer', 0.7227749512667475), ('car', 0.7759192750865143)], 'actor': { 'autori': [('smug', 1.0), ('pol', 1.0), ('traff', 1.0), ('local authori', 0.6894454471465952), ('driv', 0.6121365092485745), ('car', 0.6297345748705596)], 'fam': [('fa', 1.0), ('mo', 1.0), ('bro', 1.0), ('son', 0.9925431812951816), ('sis', 0.9789254869156859), ('fami', 0.8392597243422916)], 'fri': [('fri', 1.0), ('compats', 1.0), ('mo', 0.814126196299157), ('neighbor', 0.7433986938516075), ('parent', 0.32202418215134565), ('bro', 0.8496284151715676), ('fami', 0.6375584385858655), ('best fri', 0.807654599975373)] } } # 初始化全局最高分数映射 max_scores = {} def collect_max(data): if isinstance(data, list): for word, score in data: # 更新当前词的最高分数 if word not in max_scores or score > max_scores[word]: max_scores[word] = score elif isinstance(data, dict): # 递归处理字典里的每个值 for val in data.values(): collect_max(val) # 收集所有词的最高分数 collect_max(a)
步骤2:过滤冗余元组
遍历原字典结构,只保留每个元组中分数等于对应词最高分数的项,生成新字典:
def filter_redundant(data): if isinstance(data, list): # 过滤列表中分数不是最高的元组 return [(word, score) for word, score in data if score == max_scores[word]] elif isinstance(data, dict): # 递归处理字典的每个键值对 return {key: filter_redundant(val) for key, val in data.items()} # 生成去重后的新字典 new_a = filter_redundant(a) # 打印结果验证 import pprint pprint.pprint(new_a)
运行后得到的结果就是你期望的输出。
关于遍历的必要性
你必须遍历所有元组两次:第一次是收集最高分数(这一步无法跳过,因为你需要全局对比每个词的分数),第二次是过滤冗余。但这两次遍历都是线性时间复杂度O(n)(n是所有元组的总数),已经是最优效率了——不可能在不查看所有元组的情况下,知道哪个词的分数最高。
内容的提问来源于stack exchange,提问作者Erwin
相关产品推荐
相关产品推荐

