從集合中查詢最值得方法——max(),min(),nlargest(),nsmallest()
阿新 • • 發佈:2019-01-05
從集合中查詢最值得方法有很多,常用的方法有max(),min(),nlargest(),nsmallest()等。
一、max()和min()
1.1 入門用法
直接使用max(),min(),返回可迭代物件中的最大值和最小值。
1 a = [1, 5, 2, 1, 9, 1, 5, 10] 2 print(max(a)) 3 print(min(a)) 4 5 #執行結果如下 6 10 7 1
1.2 進階用法
我們以max()為例來分析。max(interable,key=none),即max()函式中第一個引數需要提供一個可迭代的查詢物件。key值為空時,僅返回一個最大值。當key值非空時,max()函式就以key為標準來判斷,通常可結合匿名函式使用。
1 a = [14, -57, 21, 10, 19, 12, 25, 10] 2 print(max(a, key=lambda x:str(x))) #以對應的字串做判斷標準 3 print(max(a, key=lambda x:len(str(x)))) #以對應的字串的長度做判斷標準 4 print(max(a, key=lambda x:abs(x))) #以絕對值大小做判斷標準 5 6 #執行結果如下 7 25 8 -57 9 -57
min()的用法與max()同理,不再舉例
1.3 高階用法
高階用法可與zip()結合,查詢字典中value最大的item項。比如,有一組商品,商品名和價格的對映關係體現在字典中,如下:
prices={ "裝載機":768, "推土機":248, "平地機":131, "橄欖車":375, "反剷":636 }
這裡需要注意的是在進行字典操作時,預設是對key進行操作,而不是value(其中一個很重要的原因是key具有唯一性,而value沒有)。所以,我們要使用zip方法將字典的鍵值反轉過來,在進行排序查詢。
min_price = min(zip(prices.values(),prices.keys())) print(min_price) max_price = max(zip(prices.values(),prices.keys())) print(max_price) #執行結果如下 (131, '平地機') (768, '裝載機')
注意:
zip()是建立了一個迭代器,它只能使用一次,所以,如下方法是會報錯的
price_and_name = zip(prices.values(),prices.keys()) print(max(price_and_name)) print(min(price_and_name))
二、nlargest()和nsmallest()
前面提到的max()和min()只能返回一項值,而heapq模組下的nlargest()和nsmallest(),可以返回最大或最小的多個值。
1 import heapq 2 3 nums = [12,548,31,4,546,58,46,1,8,42,3,68] 4 5 print(heapq.nlargest(3,nums)) 6 print(heapq.nsmallest(4,nums)) 7 8 9 #執行結果如下 10 [548, 546, 68] 11 [1, 3, 4, 8]
可以看到nlargest()和nsmallest()可以返回指定數目的最值。與max()和min()一樣,nlargest()和nsmallest()也可以加上key作為判斷條件,從而用於更復雜的資料結構。
1 import heapq 2 3 students = [ 4 {"name":"張三", "age":19, "tuition":6000}, 5 {"name":"李四", "age":23, "tuition":4500}, 6 {"name":"王五", "age":18, "tuition":8000}, 7 {"name":"趙六", "age":29, "tuition":7000}, 8 {"name":"錢七", "age":27, "tuition":5500} 9 ] 10 11 print(heapq.nlargest(3,students,key=lambda x:x["tuition"])) 12 print(heapq.nsmallest(3,students,key=lambda y:y["age"])) 13 14 15 #執行結果如下: 16 [{'name': '王五', 'age': 18, 'tuition': 8000}, {'name': '趙六', 'age': 29, 'tuition': 7000}, {'name': '張三', 'age': 19, 'tuition': 6000}] 17 [{'name': '王五', 'age': 18, 'tuition': 8000}, {'name': '張三', 'age': 19, 'tuition': 6000}, {'name': '李四', 'age': 23, 'tuition': 4500}]