根据范围分配成绩:
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 :(得分:5)
由于范围是连续的,您可以避免重复下限。
将所有范围放在元组中可以节省一些输入(如果第一个范围没有下降到负无穷大,请考虑在所有其他范围之前添加元组(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)。
答案 1 :(得分:0)
蛮力方法很简单
all_grades = [i for i in chain(repeat('p4',32),repeat('p6',64-32) and so on)]
then you can get grade as
grade = all_grades[size-1]
如果列表是指数的话,它可能需要空格