簡體   English   中英

最大(*args,關鍵=...)。 如何修改鍵以獲取某些值?

[英]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這將返回TrueFalse因為x<0是一個 boolean 表達式。 所以結果列表就像[False, False, False, True, True, True] 這些FalseTrue值被處理為最大 function 的01值。

max function 得到[0, 0, 0, 1, 1, 1]並且它找到第一個是列表中最大數字的第一個(數字 1),即列表中對應於數字 -5 的第一個1原始列表。

解決方案:

有多種方法可以找到最大負數,例如使用 for 循環或列表理解,甚至組合filtermax 但是,為了更好地理解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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM