尝试使程序输出成为输入百分比的等级:
percentage=90
grades={percentage>=80:'A',
percentage>=60:'B',
percentage>=40:'C',
percentage<39:'Fail'}
print(grades[percentage])
最初希望程序打印A&#39;
相反,我收到错误:
Traceback (most recent call last):
line 10, in <module>
print(grades[percentage])
KeyError: 90
感谢任何帮助,谢谢。
答案 0 :(得分:2)
您正在将dict
视为一个函数,它通过将键计算为逻辑语句来返回值。 dict
是固定键值对的存储;它没有像你期望的那样工作。
您可以编写一个功能来评估给定的成绩,或者,您可以创建一个包含所有可能的成绩等级对的dict
,并按分数查找成绩。
似乎第二种方法更符合您的需求,但问题是调用grades[percentage]
要求在percentage
字典中存储一个确切的grades
。我建议改为建立一个功能。
这看起来可能是某种家庭作业的一部分,所以我会留下一个你可以建立起点的起点。像这样:
def compute_grade(p):
if grade >= 80:
return 'A'
elif grade >= 60:
...
答案 1 :(得分:2)
您可以使用功能
def grade(percentage):
if percentage >= 80:
return 'A'
elif percentage >= 60:
return 'B'
elif percentage >= 40:
return 'C'
else:
return 'Fail'
答案 2 :(得分:0)
您正在创建一个字典,其中每个键都是基于每个比较结果的布尔值。
percentage=90
grades={percentage>=80:'A',
percentage>=60:'B',
percentage>=40:'C',
percentage<39:'Fail'}
因此,字典实际上是:
{False: 'Fail', True: 'C'}
相反,请创建一个使用range
的结构:
class Data:
def __init__(self):
self.grades = {tuple(range(80, 101)):'A', tuple(range(60, 80)):'B', tuple(range(40, 60)):'C'}
def __getitem__(self, val):
return "Fail" if not [b for a, b in self.grades.items() if val in a] else [b for a, b in self.grades.items() if val in a][0]
d = Data()
print(d[90])
输出:
'A'
答案 3 :(得分:0)
如果您只想使用字典..这是使用它的一种肮脏方式。
percentage=70
grades={80:'A',
60:'B',
40:'C',
39:'Fail'}
grade_vals = grades.keys()
obtained_grade = 'NONE'
# Sorting is super necessary
grade_vals.sort(reverse = True)
for grade in grade_vals:
if percentage > grade:
obtained_grade = grades[grade]
break
print(obtained_grade)
答案 4 :(得分:0)
这与Python评估表达式的顺序有关。
您已将布尔表达式用作grades
字典中的键。在评估grades
字典时,首先评估布尔值,然后实例化字典。
所以我们从
开始grades={percentage>=80:'A',
percentage>=60:'B',
percentage>=40:'C',
percentage<39:'Fail'}
由于percentage
已设置为90
,前三个条件为True
,最后一个条件为False
,因此字典变为:
grades={True:'A',
True:'B',
True:'C',
False:'Fail'}
我希望如果你尝试print(grades[False])
,你会得到'Fail'
。
相反,我建议你在低等级边界上键入字典:
grades={80: 'A',
60: 'B',
40: 'C',
0: 'Fail'}
然后迭代字典并选择最接近precentage
但不大于它的成绩:
grade_boundary = min([x for x in grades.keys() if percentage > x])
grade = grades[grade_boundary]