[英]max(*args, key = ... ). How to modify key to get just certain values?
我對max(*args, key =..)
function 有點困惑。假設我有以下列表: my_list = [2, 3, 4, -5, -2, -1]
。 我想在 my_list 的負值中找到最大值。 為此,我使用以下代碼max(my_list, key = lambda x: x<0)
,但它給了我-5
。 你能解釋一下邏輯嗎?
你在調用max(my_list, key = lambda x: x<0)
時說的是:“列表中的哪個值最大,但是比較每個元素的表達式 (x<0) 的結果值元素的價值。” 因此, max
運算符在決定哪個最大時基本上將列表視為[False, False, False, True, True, True]
,在 python 中,這等同於[0, 0, 0, 1, 1, 1]
。 max
返回它看到的第一個最大元素,對應於 -5。
您可能希望首先將列表過濾為僅負值,然后對結果調用max
雖然我不會為此單獨使用max
,但您可以使用不折疊多個值的適當key
function:
max(my_list, key=lambda x: -float('inf') if x > 0 else x)
這會導致所有正值進行比較,就好像它們是負無窮大一樣,負無窮大不能是包含任何非正值的列表中的最大值。
(如果所有值都是正數,您需要以某種方式對此進行調整,因為它仍將返回列表中的第一個值:沒有連續的值更大。除非有要求,否則我認為超出了問題的 scope如目前所述。)
是的,您可以通過一行max
function 來完成此操作。我將在下面進行解釋。
還有一種比我最后解釋的列表理解更好的方法。
如果您提供了 key 參數,這就是 max function 的工作原理。 它將遍歷列表的值,然后對每個值應用 lambda function(名為key
)。 所以所有的值都將映射到 lambda function 的結果。然后它對這些結果執行max
function。
所以當你有key=lambda x: x<0
這將返回True
或False
因為x<0
是一個 boolean 表達式。 所以結果列表就像[False, False, False, True, True, True]
。 這些False
和True
值被處理為最大 function 的0
和1
值。
max
function 得到[0, 0, 0, 1, 1, 1]
並且它找到第一個是列表中最大數字的第一個(數字 1),即列表中對應於數字 -5 的第一個1
原始列表。
有多種方法可以找到最大負數,例如使用 for 循環或列表理解,甚至組合filter
和max
。 但是,為了更好地理解max
function 及其參數,我向您展示了如何通過max
function 執行您想要的操作(找到最大負數)。
max(my_list, key = lambda x: min(my_list) if x>=0 else x)
此代碼將找到最大負數。
提供的 lambda 表達式將 map 所有數字如下:
如果數字是正數,我們將其最大值 function 的值替換為最小值,因此它永遠不會被選為最大負數。 (我們可以通過filter
刪除所有負數來完成此操作,但我決定只使用 lambda 來完成所有工作以向您展示方法。)
如果數字是負數,它將保持它自己的價值。 所以對於你的例子,列表是my_list = [2, 3, 4, -5, -2, -1]
它將創建[-5, -5, -5, -5, -2, -1]
然后它將在此列表上執行max
function,它將找到您想要的-1
數字。
我希望它可以幫助您了解如何僅通過max
function 找到最大負數以及最大值 function 的工作方式。
注意:此代碼不是最佳的。 因為每次它計算最小值。 此代碼僅用於學習目的。
我相信更好的代碼是這樣的:
max((num for num in my_list if num<0))
請注意,這不是列表理解。 它比列表理解更好。 相反,它創建了一個一次只處理一個值的生成器。 這比列表理解更好,因為列表理解會立即創建整個列表,然后將其發送到最大值 function。但是這段代碼一次處理每個值,並且不會用大列表填充 memory。 所以這樣效率更高。
我會使用列表理解來過濾掉正值,然后找到最大值。
max([i for i in my_list if i < 0])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.