给定一个整数列表,我想找到哪个数字最接近我输入的数字:
>>> myList = [4, 1, 88, 44, 3]
>>> myNumber = 5
>>> takeClosest(myList, myNumber)
...
4
有什么快速的方法吗?
给定一个整数列表,我想找到哪个数字最接近我输入的数字:
>>> myList = [4, 1, 88, 44, 3]
>>> myNumber = 5
>>> takeClosest(myList, myNumber)
...
4
有什么快速的方法吗?
当前回答
遍历列表并将当前最接近的数字与abs(currentNumber - myNumber)进行比较:
def takeClosest(myList, myNumber):
closest = myList[0]
for i in range(1, len(myList)):
if abs(i - myNumber) < closest:
closest = i
return closest
其他回答
def takeClosest(myList, myNumber):
newlst = []
for i in myList:
newlst.append(i - myNumber)
lstt = [abs(ele) for ele in newlst]
print(myList[lstt.index(min(lstt))])
myList = [4, 1, 88, 44, 3]
myNumber = 5
takeClosest(myList,myNumber)
值得注意的是,Lauritz使用平分的建议实际上并没有在MyList中找到与MyNumber最接近的值。相反,bisect在MyList中查找MyNumber之后的下一个值。所以在OP的例子中,你实际上会返回44的位置而不是4的位置。
>>> myList = [1, 3, 4, 44, 88]
>>> myNumber = 5
>>> pos = (bisect_left(myList, myNumber))
>>> myList[pos]
...
44
要得到最接近5的值,您可以尝试将列表转换为数组,并像这样使用numpy中的argmin。
>>> import numpy as np
>>> myNumber = 5
>>> myList = [1, 3, 4, 44, 88]
>>> myArray = np.array(myList)
>>> pos = (np.abs(myArray-myNumber)).argmin()
>>> myArray[pos]
...
4
我不知道这有多快,我猜“不是很快”。
遍历列表并将当前最接近的数字与abs(currentNumber - myNumber)进行比较:
def takeClosest(myList, myNumber):
closest = myList[0]
for i in range(1, len(myList)):
if abs(i - myNumber) < closest:
closest = i
return closest
如果我们不确定列表是否已排序,可以使用内置的min()函数来查找与指定数字距离最小的元素。
>>> min(myList, key=lambda x:abs(x-myNumber))
4
注意,它也适用于具有int键的字典,如{1:"a", 2: "b"}。该方法耗时O(n)。
如果列表已经排序了,或者你可以只对数组排序一次,使用@Lauritz的回答中说明的平分方法,它只需要O(log n)时间(注意,检查列表是否已经排序是O(n),排序是O(n log n))。
>>> takeClosest = lambda num,collection:min(collection,key=lambda x:abs(x-num))
>>> takeClosest(5,[4,1,88,44,3])
4
lambda是一种书写“匿名”函数(没有名字的函数)的特殊方式。你可以给它分配任何你想要的名字,因为lambda是一个表达式。
以上内容的“长”写法是:
def takeClosest(num,collection):
return min(collection,key=lambda x:abs(x-num))