2017-03-02 59 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

相关问题