如何在行尾中断 for 循环

How to break for loop at the end of a line

手头的任务是使用指定的输入创建字典。

第一个元素是键,后面的元素是值。

输入:

name, George Mason
pa, 100.0, 100.0, 95.0, 95.0, 97.0
lab, 100.0, 100.0, 100.0, 0.0, 100.0
zy, 100.0, 100.0, 100.0, 100.0, 100.0
mid1, 90.0
mid2, 80.0
final, 85.0

预期输出,如果项目 = False:

{'name': 'George Mason',
 'pa': [100.0, 100.0, 95.0, 95.0, 97.0],
 'lab': [100.0, 100.0, 100.0, 0.0, 100.0],
 'zy': [100.0, 100.0, 100.0, 100.0, 100.0],
 'mid1': 90.0, 'mid2': 80.0, 'final': 85.0}

预期输出,如果项目 = True:

{'name': 'George Mason',
 'pa': [100.0, 100.0, 95.0, 95.0, 97.0, 97.4, 97.4, 97.4, 97.4],
 'lab': [100.0, 100.0, 100.0, 0.0, 100.0, 80.0, 80.0, 80.0, 80.0,
80.0, 80.0],
 'zy': [100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0,
100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0],
 'mid1': 90.0, 'mid2': 80.0, 'final': 85.0}

"如果项目为真且少于9个 编程作业、11 个实验室或 15 本 zyBooks,您将需要为 所有缺失的成绩(你不需要考虑有更多的情况 成绩)。要针对给定的作业类型执行此操作,请计算该作业的平均成绩 分配类型,然后将该平均值的副本添加到给定成绩的末尾 值,以便该作业类型具有正确的成绩数。例如,如果 该文件包含以下行“pa, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0”,然后 只有 7 个编程作业等级值。如果项目是真的,你 将计算给定成绩的平均值 ((1.0+2.0+3.0+4.0+5.0+6.0+7.0)/7 = 4.0),并将其添加到等级值列表的末尾,以便字典的值 键“pa”将是列表 [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 4.0, 4.0]."

我什至没有到达真正的部分。现在我正试图弄清楚如何摆脱 KeyError: ('name', 'Carl F. Gauss\n')。我假设这是因为代码不知道一旦到达第一行的末尾就移动到下一行。我该怎么做?

我目前的代码是:

def read_grades_file(filename, project=False):
    file = open(filename, 'r')
    grade_dict = {}
    if project == False:
        for line in file.readlines():
            values = [line.split(', ')]
            key = tuple(values[0])
            val = values[1:]
            grade_dict[key].append(val)
    if project == True:
        for line in file.readlines():
            values = [line.split(', ')]
            key = tuple(values[0])
            val = values[1:]
    return grade_dict
        
print(read_grades_file('gauss.grades', project=False))

这是第一部分的建议(这是第二部分的基础):

def read_grades_file(filename, project=False):
    grade_dict = {}
    with open(filename, 'r') as file:
        for line in file:
            key, *values = line.strip().split(', ')
            if key in {'pa', 'lab', 'zy'}:
                grade_dict[key] = list(map(float, values))
            else:
                value = values[0]
                if key in {'mid1', 'mid2', 'final'}:
                    value = float(value)
                grade_dict[key] = value
    if project:
        pass
    return grade_dict

遍历文件的行

  • .strip() line 去掉空格,特别是在最后 ('\n')
  • .split(', ') 并将结果列表解压缩到第一项 key 和其余项 values
  • 如果键是palabzy,将values转换成浮点数列表,并赋值给key
  • 否则将values的剩余项提取到变量value中,如果keymid1mid2或[,则将其转换为float =29=],赋值给key.

输入结果

name, George Mason
pa, 100.0, 100.0, 95.0, 95.0, 97.0
lab, 100.0, 100.0, 100.0, 0.0, 100.0
zy, 100.0, 100.0, 100.0, 100.0, 100.0
mid1, 90.0
mid2, 80.0
final, 85.0

{'name': 'George Mason',
 'pa': [100.0, 100.0, 95.0, 95.0, 97.0],
 'lab': [100.0, 100.0, 100.0, 0.0, 100.0],
 'zy': [100.0, 100.0, 100.0, 100.0, 100.0],
 'mid1': 90.0,
 'mid2': 80.0,
 'final': 85.0}

关于第二部分:检查列表是否具有所需的最小长度。如果不是,则计算当前项目的平均值(例如使用 summath.fsumstatistics.mean)和 .extend() 平均值满足最小长度要求的列表。 (如果您需要帮助,请告诉我。)