我有一个预定义整数的Python列表:
intvals = [5000, 7500, 10000, 20000, 30000, 40000, 50000]
Run Code Online (Sandbox Code Playgroud)
我需要向下舍入到列表中的下一个更高/更高的值.因此,例如,给定数字8000,结果应该是[7500, 10000].因为42000,它应该是[40000, 50000].我想知道是否有一个简单的方法来做到这一点.
我的想法是创建一个具有两个循环的函数 - 一个减少值-1直到它在列表中找到一个循环,另一个将值增加1直到找到更高的匹配.这可行,但也许有更好的解决方案?
rob*_*ing 16
这对于bisect.bisect_right()和bisect.bisect_left()来说是完美的.
以下是一些可以展开的示例代码:
import bisect
def get_interval(x):
intvals = [5000, 7500, 10000, 20000, 30000, 40000, 50000]
i = bisect.bisect_right(intvals,x)
return intvals[i-1:i+1]
print get_interval(5500)
"""
>>>
[5000, 7500]
"""
Run Code Online (Sandbox Code Playgroud)
这种技术很快,因为它使用二进制搜索(所以logN而不是N次查找)
您可以使用bisect模块.您可能需要调整示例以满足您的边界案例需求.
>>> import bisect
>>> def RoundUpDown(rangeList,num):
beg = bisect.bisect_right(rangeList,num)
if rangeList[beg-1] == num: #Handle Perfect Hit Edge Case
return [num,num]
elif not beg: #Left Edge Case
return [None,rangeList[0]]
elif beg == len(rangeList): #Right Edge Case
return [rangeList[-1],None]
else:
return rangeList[beg-1:beg+1]
>>> RoundUpDown([5000, 7500, 10000, 20000, 30000, 40000, 50000],41000)
[40000, 50000]
>>> RoundUpDown([5000, 7500, 10000, 20000, 30000, 40000, 50000],5000)
[5000, 5000]
>>> RoundUpDown([5000, 7500, 10000, 20000, 30000, 40000, 50000],500)
[None, 5000]
>>> RoundUpDown([5000, 7500, 10000, 20000, 30000, 40000, 50000],50000)
[50000, 50000]
>>> RoundUpDown([5000, 7500, 10000, 20000, 30000, 40000, 50000],51000)
[50000, None]
>>> RoundUpDown([5000, 7500, 10000, 20000, 30000, 40000, 50000],7500)
[7500, 7500]
>>>
Run Code Online (Sandbox Code Playgroud)