对于python原生的数据类型来说,并不存在直接的方法可以找到最大或最小的N个值,
传统的方法必须先排序,然后再截取相应的值,而且对于集合这类数据类型来说还不能直接排序,
需要先转化为列表才行,有的时候非常不便,因此python提供了内置模块heapq可以解决这类问题。
下面分别对列表、集合和字典的角度解决这个需求。
1.列表
#列表 nums = [45,12,4,-5.34,23,76,85,-15,56] # (1)传统方法 nums2 = nums[:] nums2.sort() print(nums2[-3:]) #[56, 76, 85] # (2)引入库heapq #取最大的三个值 print(heapq.nlargest(3,nums)) #结果[85, 76, 56] print(heapq.nsmallest(3,nums)) #[-15, -5.34, 4]
2.集合
#集合 set1 = {45,12,4,-5,34,23,76,85,-15,56} # (1)传统方法 #由于集合不能排序,因此需要先将集合转化为列表 list1 = list(set1) list1.sort() print(list1[-3:]) #[56, 76, 85] #(2)更时尚的方法 print(heapq.nlargest(3,set1)) #[85, 76, 56] print(heapq.nsmallest(3,set1)) #[-15, -5, 4]
3.字典
#字典 names = [ {"name":"科比","age":26}, {"name":"大姚","age":38}, {"name":"丁同","age":19}, {"name":"志成","age":11}, {"name":"拉塞尔","age":84}, ] # (1)第一种方法heapq #找出年龄最大的两位(专门取值的方法) print(heapq.nlargest(2,names,lambda x:x["age"])) # (2)第二种(传统方法,可以排序,可以取值) #可以给排序指定一个字典中的键 names.sort(key=lambda x:x["age"]) print(names) # (3)第三种 # 通过公共键对字典排序然后取值, from operator import itemgetter new_names = sorted(names,key=itemgetter("age")) print(new_names[-2:]) # 第三种方法是第二种方法的浓缩,不过如果你知道第三种为何和压迫使用第二种了。
对于字典还可以使用zip反转然后排序
name={"科比":26,"大姚":38,"丁同":19,"拉塞尔":84,"志成":11} print(sorted(zip(name.values(),name.keys())))
[(11, '志成'), (19, '丁同'), (26, '科比'), (38, '大姚'), (84, '拉塞尔')]