如何提取字典中无重复前三高值对应的键(不修改原字典)
问题:提取字典中前三高唯一值对应的键(不修改原字典)
需求说明:
需要实现一个函数,打印由max_frequency函数生成的字典中,前三高无重复值对应的键。原字典允许存在重复值,且绝对不能修改原字典。
示例:
若输入字典为d = {'a':1, 'b':2, 'c':3, 'd':3, 'e':4},仅需打印a : 1、b : 2、c : 3(同值的键任选一个即可),但当前实现会把c和d都打印出来,不符合预期。
当前代码问题分析:
def top3(filename: str): """ Takes dict defined in wd_inventory, identifies top 3 words in dict :param filename: :return: """ d = max_frequency(filename) x = list(d.values()) x.sort(reverse=True) y = set(x) # 创建了去重集合但未使用 x = x[0:3] # 直接取排序后前3个,包含重复值 for i in x: for j in d.keys(): if d[j] == i: print(str(j) + " : " + str(d[j])) return
- 代码中创建了去重集合
y但完全没用到,浪费了去重逻辑 x = x[0:3]取的是排序后包含重复值的前3个元素,导致循环时会把所有对应该值的键都打印出来(比如示例中的两个3会触发两次打印)
修正后的代码:
def top3(filename: str): """ 从wd_inventory定义的字典中,找出出现频率前三高的唯一值对应的键 :param filename: :return: """ d = max_frequency(filename) # 提取所有唯一值并降序排序 sorted_unique_values = sorted(set(d.values()), reverse=True) # 取前三高的唯一值 top3_values = sorted_unique_values[:3] for val in top3_values: # 遍历字典找到第一个对应值的键,打印后终止内层循环 for key, value in d.items(): if value == val: print(f"{key} : {value}") break return
代码解释:
- 用
set(d.values())获取字典中所有唯一值,直接排除重复值干扰 - 对唯一值降序排序,得到从高到低的有序列表
- 取列表前3个元素,就是我们要的前三高无重复值
- 遍历每个目标值,在原字典中找到第一个匹配的键值对,打印后用
break终止内层循环,确保每个值只打印一个对应键 - 全程未修改原字典
d,完全符合需求
如果需要返回这些键的列表而非仅打印,可以调整代码如下:
def top3(filename: str): """ 从wd_inventory定义的字典中,找出出现频率前三高的唯一值对应的键 :param filename: :return: 包含前三高唯一值对应键的列表 """ d = max_frequency(filename) top3_values = sorted(set(d.values()), reverse=True)[:3] result_keys = [] for val in top3_values: for key, value in d.items(): if value == val: result_keys.append(key) print(f"{key} : {value}") break return result_keys
内容的提问来源于stack exchange,提问作者E.Mena14
相关产品推荐
相关产品推荐

