开发者社区> 问答> 正文

使用等分的成绩映射

from bisect import bisect

grades = "FEDCBA"
breakpoints = [30, 44, 66, 75, 85]  

def grade(total):
    return grades[bisect(breakpoints, total)]

print(grade(66))
print(list(map(grade, [33, 99, 77, 44, 12, 88])))

'''
C
['E', 'A', 'B', 'D', 'F', 'A']

[Program finished]'''

不是我的程序。从恩基进口。Bisect模块支持按排序顺序维护列表,而无需在每次插入后对列表进行排序。因此,当我们调用grade(66)时。它通过66到返回C的成绩函数,如何?第二个打印语句更加令人困惑。用列表映射功能等级。如果我尝试打印,`print(grades(grades(bisect [bisect(breakpoints,grades)]])),我会得到Err,

TypeError:“ str”和“ int”的实例之间不支持“ <”

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 09:35:31 388 0
1 条回答
写回答
取消 提交回答
  • 您的代码为输入的数据产生了正确的结果!

    断点列表[30,44,66,75,85]将字母字符串“ FEDCBA”一分为二,如下所示:

    If         grade < 30 then F 
    If   30 <= grade < 44 then E  
    If   44 <= grade < 66 then D
    If   66 <= grade < 75 then C 
    If   75 <= grade < 85 then B
    If   85 <= grade      then A
    

    因此,print(grade(66))正确地产生了C的输出。

    同样,您的print(list(map(map(grade,[33,99,77,44,12,88]))))正确地输出为[['E','A','B',' D','F','A']`。

    现在考虑到由于print(grades(grades [bisect(breakpoints,grades)]))而导致的TypeError,看起来就像是要执行grades [bisect(bisect(breakpoints,total))]。注意,将total而不是grades作为bisect()的第二个参数。

    这是工作代码的另一个版本,该版本将所有变量放在顶部,因此您可以更轻松地更改它们以进行测试:

    data_list = [33, 99, 77, 44, 12, 88]
    grade_string = 'FEDCBA'
    breakpoint_list = [30, 44, 66, 75, 85]
    def grade(total, breakpoints=breakpoint_list, grades=grade_string):
        i = bisect(breakpoints, total)
        return grades[i]
    
    print([grade(total) for total in data_list])
    

    输出为:

    ['E', 'A', 'B', 'D', 'F', 'A']
    

    回答来源:stackoverflow

    2020-03-24 09:35:39
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载