Словарь может содержать много значений, если ваши диапазоны не слишком широки, вы можете создать словарь, аналогичный тому, который вы использовали для условий равенства, расширяя каждый диапазон программно:
from collections import defaultdict
ranges = {(0,10):'A', (10,30):'B', (30,50):'C',(50,90):'D'}
valueMap = defaultdict(lambda:'E')
for r,letter in ranges.items():
valueMap.update({ v:letter for v in range(r[0],r[1]) })
valueMap[701] # 'E'
valueMap[7] # 'A'
Вы также можете просто удалить из себя лишние условия, если / elif, и отформатировать его немного по-другому. Это выглядело бы почти как заявление случая:
if score < 10 : cat = 'A'
elif score < 30 : cat = 'B'
elif score < 50 : cat = 'C'
elif score < 90 : cat = 'D'
else : cat = 'E'
чтобы избежать повторения счета <вы можете определить функцию регистра и использовать ее со значением: </p>
score = 43
case = lambda x: score < x
if case(10): cat = "A"
elif case(30): cat = "B"
elif case(50): cat = "C"
elif case(90): cat = "D"
else : cat = "E"
print (cat) # 'C'
Вы можете обобщить это, создав функцию switch, которая возвращает функцию case, которая применяется к тестовому значению с общим шаблоном сравнения:
def switch(value):
def case(check,lessThan=None):
if lessThan is not None:
return (check is None or check <= value) and value < lessThan
if type(value) == type(check): return value == check
if isinstance(value,type(case)): return check(value)
return value in check
return case
Эта универсальная версия допускает всевозможные комбинации:
score = 35
case = switch(score)
if case(0,10) : cat = "A"
elif case([10,11,12,13,14,15,16,17,18,19]):
cat = "B"
elif score < 30 : cat = "B"
elif case(30) \
or case(range(31,50)) : cat = 'C'
elif case(50,90) : cat = 'D'
else : cat = "E"
print(cat) # 'C'
И есть еще один способ использования лямбда-функции, когда все, что вам нужно сделать, это вернуть значение:
score = 41
case = lambda x,v: v if score<x else None
cat = case(10,'A') or case(20,'B') or case(30,'C') or case(50,'D') or 'E'
print(cat) # "D"
Этот последний также может быть выражен с использованием понимания списка и таблицы отображения:
mapping = [(10,'A'),(30,'B'),(50,'C'),(90,'D')]
scoreCat = lambda s: next( (L for x,L in mapping if s<x),"E" )
score = 37
cat = scoreCat(score)
print(cat) #"D"