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
您的代码为输入的数据产生了正确的结果!
断点列表[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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。