python - 如何有效地检查python中的连续范围
问题描述
根据范围分配等级:
def getGrade(size):
grade =''
if size <= 32:
grade = 'p4'
elif size > 32 and size <=64:
grade = 'p6'
elif size > 64 and size <= 128:
grade = 'p10'
elif size > 128 and size <= 256:
grade = 'p15'
elif size > 256 and size <=512:
grade = 'p20'
elif size > 512 and size <= 1024:
grade = 'p30'
elif size > 1024 and size <= 2048:
grade = 'p40'
......
问题是需要再添加 20 个检查,所以有没有比这种方法做得更好的方法。
解决方案
由于范围是连续的,您可以避免重复下限。
将所有范围放在元组中可以节省一些输入(如果第一个范围没有下降到负无穷大,请考虑(0, None)
在所有其他范围之前添加元组:
def getGrade(size):
grades = (
(32, 'p4'),
(64, 'p6'),
(128, 'p10'),
...
)
for maxVal, grade in grades:
if size <= maxVal:
return grade
测试:
>>> getGrade(45)
'p6'
>>> getGrade(100)
'p10'
效率:
如果grades
列表真的很长,您可以获得比扫描每个项目更好的运行时间。由于列表已排序,因此您可以bisect
通过替换 for 循环来使用 ,:
for maxVal, grade in grades:
if size <= maxVal:
return grade
和:
index = bisect.bisect(grades, (size, ))
if index < len(grades):
return grades[index][1]
步骤数(在最坏的情况下)从 N(的长度grades
)减少到 log 2 (N)。
推荐阅读
- scala - 在 IntelliJ 中使用 Gradle 构建具有依赖项的 Jar,包括多个主类
- spring-data-jpa - 如何转换为 JPQL 用于内联视图?
- c++ - 仅当我们在优先级队列中使用自定义比较器时才需要传递容器类型?
- javascript - 根据重复出现修改数组值
- ios - 我可以使用 NavigationController 来解除屏幕移动吗?
- php - 如何在 PHP 标记 echo 内的脚本中使用 jquery 变量?
- javascript - 在 Django 中弹出消息
- react-native - React Native 是否支持 Apple 的 M1 macbook pro?
- python - 合并 csv 值并输出到 csv
- bash - 比较两个文件中的两列,并将两个文件中的任何一个中的输出作为新列附加