Поскольку диапазоны являются смежными, вы можете избежать повторения нижней границы.
Помещение всех диапазонов в кортежи может сэкономить вам время при наборе текста (если первый диапазон не уменьшается до отрицательной бесконечности, рассмотрите возможность добавления кортежа (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).