Python:四舍五入到lis中的下一个预定义整数

2024-04-25 06:25:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个预定义整数的Python列表:

intvals = [5000, 7500, 10000, 20000, 30000, 40000, 50000]

我需要向下和向上取整列表中下一个较低/较高的值。例如,给定一个数字8000,结果应该是[7500, 10000]。对于42000,它应该是[40000, 50000]。我想知道有没有一个简单的方法来做这件事。在

我的想法是创建一个有两个循环的函数,一个循环减少值-1,直到在列表中找到一个,另一个循环将值增加1,直到找到更高的匹配。这可能有用,但也许有更好的解决方案?在


Tags: 方法函数列表数字整数解决方案将值intvals
3条回答

这是完美的一分为二()和左等分(). 在

下面是一些示例代码,您可以对其进行扩展:

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]
"""

这种技术很快,因为它使用二进制搜索(所以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]
>>> 

^{}是为这样的搜索而构建的。在

>>> intvals[bisect.bisect(intvals, 8000)]
10000
>>> intvals[bisect.bisect(intvals, 42000)]
50000

相关问题 更多 >