繁体   English   中英

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

[英]Use fewer if statements to test in which interval a given integer belongs

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 语句来编写相同的代码?

假设成绩是均匀分布的并且与分数成正比,你可以做一个 integer 除法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
        

这是output;

score: 5

为什么不简单地使用范围这个不错的属性呢? 人们实际上可以检查其中的内容。 如果您有两个范围和等级的压缩列表,或两个元组列表,您可以检查该值是否在元组的一个元素中并返回另一个。

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)

如果你想用一个打印语句来做,那么你可以这样做......

注意:代码只减少打印语句而不是条件。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM