比较分数与字典

时间:2016-10-25 00:41:43

标签: python list if-statement for-loop dictionary

我要做的是从一个文本文件中读取,该文件具有与三个等级相对应的名称列表。在程序中,文件被读取并输入到一个字典中。从字典中我比较得分和打印最高,最低等等。我正在尝试使用for循环,但我一直遇到几个问题。这次我尝试编译时遇到错误类型1。在for循环中比较字典值的最佳方法是什么?有什么建议吗?

以下是文本文件的相同内容:

Brian,94,89,92
Rachel,100,90,65
Jon,67.5,95,100
Brit,0,78,80
Greg,65,100,78
Andrea,55.5,67,79

到目前为止,这是我的代码:底部的错误输出。

def examMod ():

    students = {}

    infile = open("studentGrades.txt","r")
    for aline in infile:
        key, val1, val2, val3 = aline.split(',')
        students[key] = float(val1), float(val2), float(val3)

    for z in students.keys():   
        for x in students.items():
            if students[1] > students[2] & students[1] > students[3]:
                print("For %s test 1 is the highest scored." % z)
            elif students[2] > students[1] & students[2] > students[3]:
                print("For %s test 2 is the highest scored." % z)
            elif students[3] > students[1] & students[3] > students[2]:
                print("For %s test 2 is the highest scored." % z)


Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    examMod()
  File "E:\Python\Lib\idlelib\redoMidterm.py", line 12, in examMod
    if students[1] > students[2] & students[1] > students[3]:
KeyError: 1

2 个答案:

答案 0 :(得分:0)

我不认为你正在掏出你认为的细节。我会对keys() and items() do

进行仔细检查

您的第一个提示是KeyError: 1。这意味着,您是否已在dictionary中检查了密钥1,但它并不存在(令人困惑,但它不是错误类型1,它&# 39; s只是值1是导致错误的原因)。看看返回的行:if students[1] > students[2] & students[1] > students[3]:它将来自学生。这意味着students是字典,1不是其中的关键字。

其次,您没有正确使用这些循环。检查您如何使用它的一个很好的提示是在那里调用带有print语句的函数。 E.g。

for z in students.keys():
    for x in students.items():
        print(z, x)
        # Then comment out the rest of this loop

根据您提供给我们的前三行示例数据,这将返回:

Brian ('Brian', (94.0, 89.0, 92.0))
Brian ('Rachel', (100.0, 90.0, 65.0))
Brian ('Jon', (67.5, 95.0, 100.0))
Rachel ('Brian', (94.0, 89.0, 92.0))
Rachel ('Rachel', (100.0, 90.0, 65.0))
Rachel ('Jon', (67.5, 95.0, 100.0))
Jon ('Brian', (94.0, 89.0, 92.0))
Jon ('Rachel', (100.0, 90.0, 65.0))
Jon ('Jon', (67.5, 95.0, 100.0))

为什么?因为您使用students.keys()循环浏览每个学生的姓名,并且对于每个学生,您再次循环遍历每个学生,提供密钥和值{{1 }}。我花了一点时间搞清楚这一点,因为这实际上是你问题中最重要的部分。

您收到密钥错误的原因是什么?因为您只使用students.items()检查原始字典。

一旦你对它进行了整理,你就会遇到第三个问题。 students[...],因为您正在使用IndexError访问3元素得分数组的第4个元素。因为数组的第一个元素是索引whatever_you_are_checking[3],第二个0,第三个1。计算机科学家从0开始计算。

因此。最终,您需要:

  1. 学生只有一个循环。您只需要检查一次姓名
  2. 要查看分数,而不是在进行检查时查看学生数组
  3. 从base-0进行比较,而不是base-1
  4. 基本上是这样的:

    2

    以下是非必要的,但只是我要展示的一些东西,因为python非常酷。

    • 正如您在for z in students.keys(): if students[z][0] > students[z][1] and students[z][0] > students[z][2]: print("...") 语句中所发现的那样,您可以一次性将列表或元组的返回分解为多个变量。您可以使用它来简化for循环的生活:

      split
    • 单个陈述中的多重比较是一件事......在你的案例中很有用。

      for student_name, score in students.items():
      # or event
      for student_name, (score1, score2, score3) in students.items():
          print(student_name, score1, score2, score3)
          #: Brian 94.0 89.0 92.0
      

答案 1 :(得分:0)

您的代码中存在多个错误:

  1. 最大的一个是你如何尝试获得每个考试成绩。 students是整个字典,因此要访问一个标记,您必须调用students[student_name][exam_number]。这就是你的错误所说的,students[1]不存在。
  2. 你正在以错误的方式循环:你的第一个循环遍历学生姓名(students.keys()),然后第二个循环遍及整个dict,学生姓名以及他们的标记。这是多余的,你实际上并没有使用第二个循环。
  3. 列表索引从0开始,因此在l=[6,7]您可以调用l[0](6)和l[1](7);但是l[2]在列表之外。
  4. 你的标记比较必须有一些括号。
  5. 这些不是错误,而是建议:对于每种情况,你不应该有print,有办法获得最大值的索引。您还应该尝试更清楚地命名循环变量z不是非常明确,而studentstudent_name是。
  6. 这是第一次与原始代码保持一致的修正:

    students = {'Brian': (94,89,92), 'Rachel': (100,90,65), 'Jon': (67.5,95,100)}
    
    for student,exams in students.items():  #students.iteritems() in python2
        if (exams[0] > exams[1]) & (exams[0] > exams[2]):
            print("For %s test 1 is the highest scored." % student)
        elif (exams[1] > exams[0]) & (exams[1] > exams[2]):
            print("For %s test 2 is the highest scored." % student)
        elif (exams[2] > exams[0]) & (exams[2] > exams[1]):
            print("For %s test 3 is the highest scored." % student)
    

    这是一个更好的版本:

    for student,exams in students.items():  #students.iteritems() in python2
        best_exam = 1+exams.index(max(exams))
        print("For %s test %s is the highest scored." % (student,best_exam))