繁体   English   中英

对字典使用多个键值

[英]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.

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