Python:舍入到列表中的下一个预定义整数

Dan*_*iel 5 python

我有一个预定义整数的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次查找)


Abh*_*jit 6

您可以使用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)