Python 如何计算文本文件中班级成员的平均分数?

Python 如何计算文本文件中班级成员的平均分数?,python,Python,对于我的初级python课程,我得到了以下作业: 在输入文件中,列出了2b组地理考试的成绩。有三次考试的成绩将被列入圣诞假期前发给学生的半年报告中。 在输入的每一行中,你都可以找到学生的名字,后面是一个或多个分数不足(“"”)。这些测试的分数依次为,例如: Anne Adema\uuuuuuuuuuuuuuuuuuuuuu6.5.5 4.5 比亚德布鲁因6.7.27.7 克里斯·科恩6.87.87.3 德克·德克森1.0 5.0 7.7 可能的最低等级是1,最高等级是10。如果有人错过了考试,

对于我的初级python课程,我得到了以下作业:

在输入文件中,列出了2b组地理考试的成绩。有三次考试的成绩将被列入圣诞假期前发给学生的半年报告中。 在输入的每一行中,你都可以找到学生的名字,后面是一个或多个分数不足(“"”)。这些测试的分数依次为,例如:

Anne Adema\uuuuuuuuuuuuuuuuuuuuuu6.5.5 4.5
比亚德布鲁因6.7.27.7
克里斯·科恩6.87.87.3
德克·德克森1.0 5.0 7.7
可能的最低等级是1,最高等级是10。如果有人错过了考试,名单上的分数是1。 您的任务是为2b组的地理课程做报告,报告应如下所示:

numbers = [float(n) for n in split_line[-1].split(' ')]
小组2b的报告 安妮·阿德玛的平均成绩为5.5分 Bea de Bruin的平均等级为7.2 克里斯·科恩的平均成绩为7.3分 德克·德克森的平均成绩为4.6分 报告结束 这是迄今为止我的python代码:

NUMBER_OF_GRADES = 3

file =open('grades1.in.txt').read().split('\n')
for scores in file:
    name_numbers = (scores.split('_'))

def averages ():
    for numbers in file:
        sum=0
        numbers = split("\n")
        for num in numbers:
            sum = sum + int(num)
        averages = sum/NUMBER_OF_GRADES
    print ('% has an average grade of %.1') %(name, averages)

哪里出了问题?我错过了什么?我的拆分方式不对吗?

首先,您根本没有调用函数
平均值。您应该将其添加为代码中的最后一行,但实际上根本不需要函数定义

  • 使用
    with
    -语句打开和自动关闭文件
  • 接下来,您可以使用
    re
    包分割下划线处的行
  • 您必须拆分等级列表(假设它们之间用空格分隔)
  • 您可以使用内置函数
    sum
    len
    计算总和和等级数
最后,它可能看起来像这样

import re

with open('grades1.in.txt') as grades_file:
    for line in grades_file:
        name, grades = re.split("_+", line)
        grades = [float(k) for k in grades.split()]
        avg = sum(grades)/len(grades)
        print("{} has an average grade of {:.2f}.".format(name, avg))

GoTN已经回答了你的问题

要使其更清晰并有所改进,您可以尝试:

def averages(line, number_of_grades):
    line_parsed = line.split('_')

    numbers = [float(x) for line_parsed[-1].split(' ')]

    name = line_parsed[0]

    # you can use number_of_grades or len(numbers)
    # Although, if the student only has 2 grades in the file,
    # but it was supposed to be two the average will be wrong.
    avg = sum(numbers)/number_of_grades

    print("{} has an average grade of {:.2f}.".format(name, avg))
    # or print(f'{name} has an average grade of {avg:.2f}')

NUMBER_OF_GRADES = 3

files =open('grades1.in.txt').read().splitlines()

for line in files:
    if len(line) > 0:
        averages(line, NUMBER_OF_GRADES)

您的代码有一些地方出错。这可能应该迁移到,但我现在将在这里写下我的答案

我将尽可能地将其与您的版本保持一致,这样您就可以看到如何在不需要大量您可能还没有学到的东西的情况下从您现在的位置获得一个工作示例。首先让我们一次只看一部分

file =open('grades1.in.txt').read().split('\n')
您的
文件将是一个字符串列表,其中每个字符串都是输入文件中的一行。请注意,如果输入中有空行,则此列表中的某些行将是空字符串。这以后很重要

for scores in file:
    name_numbers = (scores.split('_'))
将行的名称部分与行的分数部分分开可以很好地工作,因此我们将保留它,但您在这里使用它做什么?现在,您正在使用文件中的每一新行覆盖
name\u numbers
,并且从未对其进行任何操作,因此我们将把它移动到您的函数中,并更好地利用它

def averages():
没有争论?我们会努力的

    for numbers in file:
请记住,您的
文件
是一个列表,其中列表中的每个条目都是输入文件的一行,因此该
文件中的数字
实际上没有意义。我想这是你第一次出错的地方。在使用
分数进行拆分后,您希望查看每行中的数字。拆分(“')
,为此,我们需要为拆分结果编制索引。当您拆分第一行时,会得到如下结果:

split_line = ['Anne Adema', '', '', '', '', '', '', '', '', '', '', '', '6.5 5.5 4.5']
第一个元素(
split_-line[0]
)是名称,最后一个元素(
split_-line[-1]
)是数字,但您仍然需要将它们分开!要获得一个数字列表,实际上必须将其拆分,然后将每个字符串解释为一个数字。使用列表理解(Python中循环的最佳方式)可以非常容易地做到这一点,如下所示:

numbers = [float(n) for n in split_line[-1].split(' ')]
这类似于:首先在空格处拆分行的最后一个元素以获得
['6.5','5.5','4.5']
(注意它们都是字符串),然后将该列表中的每个值转换为浮点数,最后将该浮点数列表保存为
数字。好的,继续:

        sum=0
        numbers = split("\n")  # already talked about this
        for num in numbers:
            sum = sum + int(num)
        averages = sum/NUMBER_OF_GRADES
sum
是Python中的一个关键字,我们从来不想给关键字赋值,所以这里有点不对劲。实际上,您只需在任何列表(实际上是任何iterable)
my\u list
上调用
sum(my\u list)
,即可获得列表中所有值的总和。要取平均值,您只需将该总和除以列表的长度,您可以使用
len(my_list)
获得该长度

有一些很酷的打印格式化文本的新方法,我将在下面介绍其中一种,但是如果你想用这种方法,那么我说坚持使用它。也就是说,我不能让这条线为我工作,所以我选择了一些我更了解的东西


将其改写为有效的内容: 并在您的数据上运行它:

file =open('grades1.in.txt').read().split('\n')
for line in file:
    averages(line)  # call the function on each line
# Anne Adema has an average grade of 5.5
# Bea de Bruin has an average grade of 7.2
# Chris Cohen has an average grade of 7.3
# Dirk Dirksen has an average grade of 4.6
结果显示在函数调用下面的注释中。还有一点需要注意的是,您从未关闭过文件,事实上,您也从未通过保存文件句柄来关闭它。通过使用Python中的语法,您可以摆脱与此相关的任何头痛问题:

with open('grades1.in.txt', 'r') as a_file:
    for line in a_file:
        averages(line)
<>这会自动处理关闭文件,并且即使在上下文管理器中执行的代码块中间出错,也会确保这样做。您可以循环查看一个_文件,因为它基本上是一个iterable,每次访问它时返回文件中的下一行。

将这些行拆分有些复杂。下面的代码首先用空格替换所有的
“\uquot
字符,然后将结果拆分。由于组成全名的部分数量可变,因此此拆分的结果使用反向索引进行“切片”,反向索引在值序列的末尾计数

我们知道最后三个项目必须是考试成绩,因此前面的所有项目都必须是组成名称的部分,这一点可以利用。这是我们要做的事
with open('grades1.in.txt', 'r') as a_file:
    for line in a_file:
        averages(line)
names, test_scores = line[:-NUMBER_OF_GRADES], line[-NUMBER_OF_GRADES:]
NUMBER_OF_GRADES = 3

with open('grades1.in.txt') as file:
    for line in file:
        line = line.replace('_', ' ').split()
        names, test_scores = line[:-NUMBER_OF_GRADES], line[-NUMBER_OF_GRADES:]
        name = ' '.join(names)  # Join names together.
        test_scores = [float(score) for score in test_scores]  # Make numeric.
        average_score = sum(test_scores) / len(test_scores)
        print('%s has an average grade of %.1f' % (name, average_score))