use*_*846 16 python if-statement range python-3.x
我试图检查一个数字是否在整数范围内,并根据它所在的范围返回一个数字。我想知道是否有更好,更有效的方法来做到这一点:
def checkRange(number):
if number in range(0, 5499):
return 5000
elif number in range(5500, 9499):
return 10000
elif number in range(9500, 14499):
return 15000
elif number in range(14500, 19499):
return 20000
elif number in range(19500, 24499):
return 25000
elif number in range(24500, 29499):
return 30000
elif number in range(29500, 34499):
return 35000
elif number in range(34500, 39499):
return 40000
elif number in range(39500, 44499):
return 45000
Run Code Online (Sandbox Code Playgroud)
这感觉像是在浪费资源,如果有更好的方法来做到这一点,我们将不胜感激。
Mar*_*yer 25
由于您有连续的、排序的范围,因此一种更快、更简洁的方法是使用bisect模块在断点列表中查找索引,然后使用它从值列表中获取相应的值:
import bisect
break_points = [5499, 9499, 14499, 19499, 24499, 29499, 34499, 39499, 44499]
values = [5000, 10000, 15000, 20000, 25000, 30000, 35000, 40000, 45000]
n = 10000
index = bisect.bisect_left(break_points, n)
values[index]
# 15000
Run Code Online (Sandbox Code Playgroud)
n如果有可能,您需要测试超过最后一个断点的值。或者,您可以将默认值添加到值列表的末尾。
如果更好,您的意思是更快,那么检查下限和上限是个好主意,正如之前的评论/答案所建议的那样。
但是,请注意,在 Python3 中,range()对象会为您执行此操作,导致in range()检查几乎是恒定时间操作,因此我认为使用您的代码的运行时应该不会很糟糕。
我强烈建议阅读此主题:
为什么“1000000000000000 in range(1000000000000001)”在Python 3中如此之快?
| 归档时间: |
|
| 查看次数: |
2500 次 |
| 最近记录: |