如何从字典中提取任意数量的最小值对应的键?
提取字典中指定数量最小值对应的键
场景说明
原代码仅能提取对应单一最小值的键,若要提取对应前N个最小值的键,可根据具体需求选择以下实现方式:
方式一:提取对应前k个最小不同值的所有键
如果需要收集所有对应前k个最小数值的键(比如最小的2个数值,不管每个数值对应多少个键),步骤如下:
- 提取字典中所有不重复的值,排序后取前k个最小值
- 遍历字典,收集所有值属于这k个最小值的键
代码示例:
scores = { 0:1.3399288498085087, 1:1.2672683347433629, 3:1.6999159970296505, 4:1.8410942584597279, 5:1.336658057628646 } k = 2 # 要取前2个最小值对应的键 # 提取不重复的值并排序,取前k个 sorted_unique_values = sorted(set(scores.values()))[:k] # 收集对应键 minimum_keys = [key for key, val in scores.items() if val in sorted_unique_values] print(minimum_keys) # 输出: [0, 1, 5]
方式二:提取前k个最小的键值对对应的键(含重复值)
如果只需要按值从小到大取前k个键值对的键(即使有多个键对应同一个值,也只取到第k个为止),可以用以下两种方法实现:
方法A:用sorted全排序
直接对字典的键值对按值升序排序,取前k个的键:
scores = { 0:1.3399288498085087, 1:1.2672683347433629, 3:1.6999159970296505, 4:1.8410942584597279, 5:1.336658057628646 } k = 2 # 按值升序排序键值对,取前k个的键 sorted_items = sorted(scores.items(), key=lambda x: x[1]) minimum_keys = [item[0] for item in sorted_items[:k]] print(minimum_keys) # 输出: [1, 5]
方法B:用heapq高效获取(适合大字典)
当字典规模很大时,heapq.nsmallest无需全排序,直接定位前k个最小元素,性能更优:
import heapq scores = { 0:1.3399288498085087, 1:1.2672683347433629, 3:1.6999159970296505, 4:1.8410942584597279, 5:1.336658057628646 } k = 2 # 获取前k个最小的键值对,提取键 smallest_items = heapq.nsmallest(k, scores.items(), key=lambda x: x[1]) minimum_keys = [item[0] for item in smallest_items] print(minimum_keys) # 输出: [1, 5]
内容的提问来源于stack exchange,提问作者Jared Greathouse
相关产品推荐
相关产品推荐

