使用字典的多个键值

时间:2017-12-09 23:16:20

标签: python python-3.x dictionary

尝试使程序输出成为输入百分比的等级:

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

感谢任何帮助,谢谢。

5 个答案:

答案 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]