使用更少的if语句来测试给定整数属于哪个区间


m = int(input("How many marks on the test? (/100)"))
if m >= 10 and m < 20:
print("Grade 1.")
elif m >= 20 and m < 30:
print("Grade 2.")
elif m >= 30 and m < 40:
print("Grade 3.")

上面的代码用于对考试成绩进行评分,满分为100分,等级为1至9,9为90分或更高的最高分。

我怎么能做相同的代码,但更少的if/elif语句?

假设成绩是等距的,并且与分数成正比,你可以做一个整数除法,a//b

但如果规模不是线性的,我建议通过循环通过阈值列表来完成:

grades = [
30, # 1 (lowest passing grade)
50, # 2
60, # 3
70, # 4
75, # 5
# more grades...
]
score = int(input("score"))
for grade, threshold in enumerate(grades):
if score < threshold:
print(f"grade: {grade}")
break
else:
# this happens if the score is
# higher than the highest grade
# threshold in the list (75 in
# this case)
print("Wow, very high score!")

对于这种具有统一边界尺寸的特定场景,Yevhen的解决方案无疑是最好的。虽然如果上限应该是9级,它确实会错100/100(10级)。

如果情况稍有不同(即3年级从30到50),那么你可以考虑如下方法:

m = int(input("How many marks on the test? (/100)"))
grades = {0: {"lb": 0, "ub":10},
1: {"lb": 10, "ub":20},
2: {"lb": 20, "ub":30}, 
3: {"lb": 30, "ub": 40},
4: {"lb": 40, "ub": 50},
5: {"lb": 50, "ub": 60},
6: {"lb": 60, "ub": 70},
7: {"lb": 70, "ub": 80},
8: {"lb": 80, "ub": 90},
9: {"lb": 90, "ub": 101},
}
for grade, bounds in grades.items():
if m >= bounds["lb"] and m < bounds["ub"]:
print(f"Grade {grade}")
break

在这个例子中,上面的字典可以自动生成:

grades = {}
for grade in range(0, 10):
grades[grade] = {"lb": grade*10, "ub": (grade+1)*10}
grades[9]["ub"] = 101  # The correction to avoid grade 10 if mark is 100

也许还应该指出的方便的事情是,你可以命名主键的任何你想要的,等级A*, A, B+, B, B-等?没问题。对于更复杂的用例,您甚至可以为不同的东西附加额外的键值对,甚至不同的方法句柄,以进行进一步处理。

我是这样做的;

m = 56
# gradeDict = {'score':'grade'}
gradeDict = {10:1,
20:2,
30:3,
40:4,
50:5,
60:6,
70:7,
80:8,
90:9,
100:9}

for k in gradeDict.items():
if m<k[0]:
print("score:", k[1]-1)
break

输出;

score: 5

为什么不直接使用range的这个属性呢?可以查看里面有什么。如果您有两个包含范围和等级的压缩列表,或者两个包含元组的压缩列表,则可以检查值是否在元组的一个元素中,并返回另一个元素。

points = 25
ranges = [range(10, 20), range(20, 30), range(30, 40), range(90, 101)]
grades = [1, 2, 3, 10]
zipped = zip(ranges, grades)
for item in zipped:
if points in item[0]:
result = f'Grade {item[1]}.'
break
print(result)

最新更新