2017-03-02 49 views
-2

作爲問題答案給出的推薦表達式是: How to find the smallest closest number in a list in python是我正在搜索的內容。 但是,當我試圖運行它發生了一些事情,我並不期待。使用min(list_1,key = func)的python表達式返回列表中的最大數字小於給定數字

我使用的列表和從上面的問題的數量,即:

list_of_numbers = [4, 9, 15, 25]

number = 20

和表達:

min(list_of_numbers, key=lambda x: (abs(x - number), x))

如所預期的,我數字15.

然而,當我換了號碼:

number = 91 

list_new = [] for i in range(4,98,4): list_new.append(i)

min(list_of_numbers, key=lambda x: (abs(x - number), x)) 

list_new是:

[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96] 

所以我預計88一個答案,因爲這發生了什麼事對應當我嘗試原始問題時,我仍然得到92.

如果我從一開始就看錯了問題和答案,我將很感激我的問題尋求的答案。

我在Python 3.6上運行這個。

+0

91比88更接近92.它找到算術上最接近的數字,所以我不確定如何將您的初始結果解釋爲對應於第二個。在兩種情況下都發生同樣的事情如果有多個同樣接近的表達式,表達式會返回列表中的第一個數字。但是,這不是在你的第二個例子中發生的事情。 – pvg

+0

如果是這種情況,我可能會看到錯誤的答案。你有沒有建議如何檢索一個小於給定數字的列表中的最大數字?這是我最初尋找答案的問題,最好使用min()。 – YaoS

回答

1

該代碼發現最接近數字,因爲它使用絕對值。

你可能會考慮只使用列表理解intstead:

>>> L = range(4,98,4) 
>>> number = 91 
>>> max([n for n in L if n < number]) 
88 
+1

你可以擺脫內部列表comp,只是使用一個gen exp – acushner

+0

非常感謝。這是我正在尋找的。 – YaoS

0

你必須讓你的關鍵功能不對稱,例如通過使用if條件:

max(list_of_numbers, key=lambda x:x if x < number else -1e99) 
+0

感謝您的支持。這也適用。 – YaoS

相關問題