这是我的清单:a = [1, 3, 4, 7, 8, 9, 12, 13, 14]。
我想得到最接近5的号码,这是解决方案:
b = min(a, key = lambda x: abs(x-5))请解释上线中发生了什么。
发布于 2018-10-23 09:23:26
abs(x-5)
abs是与|x-5|等价的绝对数学函数。示例:当abs(x-5) x=6是1时,当x=4也是1时。lambda x: abs(x-5)
它可以写成
def func(x):返回abs(x-5)
这意味着a = [1,3,4,7,8,9,12,13,14]
lambda x: abs(x-5)
会给
4,2,1,2,3,4,7,8,9key = lambda x: abs(x-5)
在这里,这个lambda函数返回的值存储在key变量中。
因此
键= 4,2,1,2,3,4,7,8,9min(a, key)
min函数使用key作为可迭代的方法来计算最小值。使用从键获得的最小值的位置,它显示来自可迭代a的值。
因此
键= 4(0),2(1),1(2),2(3),3(4),4(5),7(6),8(7),9(8)
最小值在位置2为1,在可迭代的a中在2位置显示值。
1(0)、3(1)、4(2)、7(3)、8(4)、9(5)、12(6)、13(7)、14(8)
也就是4。发布于 2018-10-23 09:12:19
发布于 2018-10-23 09:12:30
解释
min(iterable, key)返回iterable中相对于key的最小项。因此,它遍历iterable,每次计算元素x的key(x),然后返回key(x)最小的元素。
从key=lambda x=abs(x-5)开始,我们计算了5之间的绝对差异,所以如果是x=3,那么abs(x-5)就是2,所以这将得到最接近5的数字。
使之成为O(log )算法
如果列表是有序的,您可以在对数时间内找到以下内容:
from bisect import bisect_left
def closest(ordered_list, x):
idx = bisect_left(ordered_list, x)
return min(ordered_list[max(idx-1,0):idx+1], key=lambda y: abs(y-x))例如:
>>> closest(a, -1)
1
>>> closest(a, 0)
1
>>> closest(a, 1)
1
>>> closest(a, 2)
1
>>> closest(a, 3)
3
>>> closest(a, 4)
4
>>> closest(a, 5)
4
>>> closest(a, 6)
7
>>> closest(a, 11)
12
>>> closest(a, 15)
14https://stackoverflow.com/questions/52945163
复制相似问题