Python存放二维列表,统计分数

在文本文件scores.txt中保存了一些专业的课程平均分,如下图所示:
专业 C语言 Java Python C# Javascript
软件工程 95 96 85 63 91
计算机科学与技术 75 93 66 85 88
网络工程 86 76 96 93 67

编写一个Python程序,读入文本文件scores.txt中的数据,存放在二维列表中,并输出所有专业的分数;计算每个专业的最高分和最低分,按输出格式要求输出每个专业的名称、最高分、最低分以及对应的课程名(已知没有同分的情况);
输出格式要求:

img

这个,怎么能有二维列表呢

with open('scores.txt', 'r',encoding='utf-8') as f:
    titles = f.readline().split()
    lines = [line.split() for line in f]
    for line in lines:
        scores = list(map(int, line[1:]))
        minIndex = scores.index(min(scores)) + 1
        maxIndex = scores.index(max(scores)) + 1
        print(f"专业:{line[0]} 最高分('{titles[maxIndex]}',{line[maxIndex]}) 最低分('{titles[minIndex]}',{line[minIndex]})")



二维表就是列表里面的元素是一个列表,lines 本身已经是一个二维的了。将你的代码稍微修改下,以符合题目的输出要求:

with open('scores.txt', 'r', encoding='utf-8') as f:

    lines = [line.split() for line in f.readlines()]
    for line in lines:
        print(line)

    titles = lines[0]
    print('\n')
    for i in range(1,len(lines)):
        line = lines[i]
        scores = list(map(int, line[1:]))
        minIndex = scores.index(min(scores)) + 1
        maxIndex = scores.index(max(scores)) + 1
        print(f"专业:{line[0]} 最高分('{titles[maxIndex]}',{line[maxIndex]}) 最低分('{titles[minIndex]}',{line[minIndex]})")




运行结果:

img

list里面继续塞list,不就是二维list吗
类似这样[[],[],[]]
lines = [line.split() for line in f]这东西本身就是二维list呀
你可以打印lines看看里面到底是什么

  • 以下回答由chatgpt基于相关博客总结生成:

    我可以为您提供解决问题的参考代码,请注意,我只是根据您的问题和参考资料提供一种可行的解决方案,您可以在此基础上进行修改和调整。

    # 问题1:读取文本文件并将数据存放在二维列表中
    def read_file(file_path):
        data = []
        with open(file_path, 'r') as f:
            for line in f:
                items = line.strip().split(',')  # 根据实际情况调整分隔符
                data.append(items)
        return data
    
    # 问题2:二维列表遍历示例
    def traverse(data):
        for row in data:
            for item in row:
                print(item, end='\t')
            print()
    
    # 问题3:计算每个专业的最高分和最低分
    def calculate_scores(data):
        scores = {}
        for row in data:
            major = row[0]
            score = int(row[1])
            if major in scores:
                scores[major].append(score)
            else:
                scores[major] = [score]
        results = []
        for major, vals in scores.items():
            max_score = max(vals)
            min_score = min(vals)
            result = '{}\t{}\t{}'.format(major, max_score, min_score)
            results.append(result)
        return results
    
    # 主程序,示例代码
    if __name__ == '__main__':
        file_path = 'scores.txt'
        data = read_file(file_path)
        traverse(data)
        results = calculate_scores(data)
        for result in results:
            print(result)
    

    以上代码中,read_file函数可读取指定路径的文本文件,将其转换为二维列表并返回。traverse函数可遍历二维列表中的每一个元素并打印。calculate_scores函数可根据每一行的数据计算出每个专业的最高分和最低分,并返回结果列表。主程序中,我们可以先读取文件并打印其内容,然后计算出每个专业的最高分和最低分并打印出来。

    另外,根据参考资料和问题描述,我们还可以对程序进行如下改进:

    1. 使用csv库读取文本文件,可以更方便地读取和处理CSV格式的数据。
    2. 对输入非法情况进行判断和处理,可以在读取每一个分数时加上异常处理代码,并提示用户重新输入,直至输入合法的分数。
    3. 可以使用字典结构代替二维列表存储数据,这样可以更方便地进行统计和分析。可以使用第8段参考资料中提供的方法将其他数据结构转化为一键多值的字典。例如,可以使用以下代码将文件中的数据存储为一个字典结构:
    import csv
    from collections import defaultdict
    
    def read_file(file_path):
        data = defaultdict(list)
        with open(file_path, 'r') as f:
            reader = csv.reader(f)
            for row in reader:
                major, score = row
                score = int(score)
                data[major].append(score)
        return data
    
    if __name__ == '__main__':
        file_path = 'scores.csv'
        data = read_file(file_path)
        for major, scores in data.items():
            max_score = max(scores)
            min_score = min(scores)
            print('{}\t{}\t{}'.format(major, max_score, min_score))
    

    上述代码中,我们使用了csv库读取文件,并使用defaultdict定义了一个字典结构,然后遍历文件中的每一行数据,对每一行数据进行解析,并将其存储到字典中。最后遍历字典中的每个键值对,计算每个专业的最高分和最低分并打印出来。与原来的代码相比,这个版本更加简洁明了,并且具有更好的可读性和可维护性。