从整数列表中,获取最接近给定值的数字。
问题的出现原因:从给定的整数列表中找到最接近给定值的数字。
解决方法:使用lambda函数和min函数来实现。
代码如下:
takeClosest = lambda num, collection: min(collection, key=lambda x: abs(x - num)) takeClosest(5, [4, 1, 88, 44, 3])
其中,lambda是一种特殊的写法,用于编写匿名函数(即没有名称的函数)。由于lambda是一个表达式,所以可以给它任何想要的名称。
上面代码的长写方式如下:
def takeClosest(num, collection): return min(collection, key=lambda x: abs(x - num))
然而,根据PEP 8的建议,不推荐将lambda赋值给名称。
以上就是解决问题的方法。通过lambda函数和min函数,可以从给定的整数列表中找到最接近给定值的数字。
(From list of integers, get number closest to a given value)这个问题的出现的原因以及解决方法:
问题出现的原因:当我们有一个整数列表和一个给定的值时,我们想要找到列表中距离给定值最近的数字。
解决方法:我们可以使用二分查找的方法来解决这个问题。首先,我们需要确保列表是排序好的。然后,我们使用Python的bisect模块中的bisect_left函数来找到给定值在列表中的位置。通过比较给定值与当前位置的数字与前一个位置的数字的差值,以及当前位置的数字与后一个位置的数字的差值,我们可以确定哪个数字更接近给定值。最后,我们返回最接近给定值的数字。
对于已排序的列表,使用bisect方法比使用min方法的速度更快。在进行了一系列的测试后,我们发现使用bisect方法的运行时间大约是使用min方法的1/20。即使我们在每次调用take_closest函数时都对列表进行排序,bisect方法仍然是最快的解决方法,尽管只比min方法快约30%。
如果我们不需要对列表进行排序,而是使用未排序的列表,那么使用min方法可能会更快一些。但是,随着列表的增长,排序本身的时间复杂度为O(N log N),因此当列表变得很大时,排序方法将变得更慢。
当我们需要从整数列表中找到距离给定值最近的数字时,可以使用排序后的列表和bisect方法来实现最快的解决方法。如果不需要对列表进行排序,或者列表较小,可以考虑使用min方法来解决这个问题。
从上述内容中可以整理出以下问题的出现原因和解决方法:
问题:从给定的整数列表中找到最接近给定值的数字。
原因:当我们需要从一个整数列表中找到最接近给定值的数字时,我们需要一个方法来解决这个问题。
解决方法:
1. 如果我们不能确定列表是否已经排序,可以使用内置的min()
函数来找到与指定数字距离最小的元素。
示例代码:
>>> min(myList, key=lambda x:abs(x-myNumber)) 4
注意,这个方法也适用于具有整数键的字典,如{1: "a", 2: "b"}
。这种方法的时间复杂度为O(n)。
2. 如果列表已经排序,或者你可以支付排序数组一次的代价,可以使用二分法的方法来解决这个问题。这种方法只需要O(log n)的时间复杂度。
示例代码:
参考这个回答
3. 如果还需要返回在列表中发生这种情况的索引,可以创建自己的min
函数的实现,将其应用于字典的items()
而不是列表,并在最后返回键而不是值。
示例代码:
可以使用numpy.argmin
代替min
来获取索引而不是值。
以上是从内容中整理出的解决问题的原因和方法。