[英]Using multiple key values for dictionary
试图使程序输出为输入百分比的等级:
percentage=90
grades={percentage>=80:'A',
percentage>=60:'B',
percentage>=40:'C',
percentage<39:'Fail'}
print(grades[percentage])
最初希望程序打印“ A”
相反,我得到一个错误:
Traceback (most recent call last):
line 10, in <module>
print(grades[percentage])
KeyError: 90
任何帮助表示赞赏,谢谢。
您将dict
当作一个函数,该函数通过将键作为逻辑语句进行评估来返回值。 dict
是固定键值对的存储; 它无法按您期望的方式工作。
您可以编写一个函数来评估给定的成绩,也可以创建一个包含每个可能的得分-成绩对的dict
,并按得分查找成绩。
似乎第二种方法似乎更适合您,但问题是调用grades[percentage]
要求在grades
字典中存储确切的percentage
。 我建议改建一个函数。
看起来这可能是某种家庭作业的一部分,所以我将为您提供一个起点。 像这样:
def compute_grade(p):
if grade >= 80:
return 'A'
elif grade >= 60:
...
您可以使用一个功能
def grade(percentage):
if percentage >= 80:
return 'A'
elif percentage >= 60:
return 'B'
elif percentage >= 40:
return 'C'
else:
return 'Fail'
您正在创建一个字典,其中每个键都是基于每个比较结果的布尔值。
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'
如果您只想使用字典..这是一种使用它的肮脏方式。
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)
这与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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.