Python字典,学生成绩统计

img

img

img


请帮忙看看我写的代码哪里有问题?我的输出格式有误,但是不会改了😭,Python初学者一枚,多多谅解
代码如下:

d=eval(input())
lsVK=[(v,k)for k,v in d.items()]
lsVK.sort(reverse=True)
lsKV=[(k,v)for v,k in lsVK]
lsKV=dict(lsKV)
print(lsKV)
n=len(lsVK)
sum=0
for value in lsKV.values():
    sum+=value
average=sum/n
print("平均分={:.2f}".format(average))
lsKV=[(k,v)for v,k in lsVK]
print("最高分:")
print(lsKV[0])
print(lsKV[1])

img


这是我的有问题的输出

你这结果没毛病啊,代码也没问题啊,你纠结的是啥?
1003和1008的顺序?

img


你要是实在纠结,那就加一行代码,改完后效果是这样的(和你示例图片里一模一样):

img


源码在这里:

d=eval(input())
lsVK=[(v,k)for k,v in d.items()]
lsVK.sort(reverse=True)
lsKV=[(k,v)for v,k in lsVK]
lsKV=dict(lsKV)
lsKV=dict(sorted(lsKV.items(), key=lambda x: (-x[1], x[0])))
print(lsKV)
n=len(lsKV)
sum=0
for value in lsKV.values():
    sum+=value
average=sum/n
print("平均分={:.2f}".format(average))
print("最高分:")
for k, v in list(lsKV.items())[:2]:
    print(f'{k}:{v}')

lsVK=[(v,k)for k,v in d.items()]
lsVK = lsVK.sort(reverse=True)
print(IsVK) #你缺少输出字典

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7725154
  • 你也可以参考下这篇文章:Python自学网站,视频都很短,不经意间就看了快一百个了,一个有情怀的网站。
  • 同时,你还可以查看手册:python- 自定义扩展类型:教程- 基础 中的内容
  • 除此之外, 这篇博客: 某师范教授说,多数人学Python不懂这个方法,所以再勤奋也是枉然中的 Python是很容易入门的编程语言,可为什么那么多学不好,因为你不懂这个方法,即使再勤奋学习,也是浪费时间。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    方法其实很简单,就是三个要点:

    1、在零基础的情况下,自动学好Python的方法
    2、每天都有可视化的结果,每天都能看到学习成果
    3、可视化的发展方向,可以直接找工作,与自身利益挂钩,提升学习动力

    似乎方法三句话就概括了,但其实没那么简单,往下看。

    第一要点,自动入门Python的方法

    这本书似乎有种魔力,越看越有兴趣,而且不像初学,反而仿佛Python中的知识点早已经存在脑海了,而且越是看得多,越是觉得自己在复习,而不是在学习。
    在这里插入图片描述

    第二要点,每天都能看到自己的学习成果

    这一点是在第一要点的基础上,你可以每天都看到学习的成果,并且这种成果会给自己带来鼓励,感觉自己确实很厉害。在这里插入图片描述

    这本书的名字叫《笨办法学Python》第四版,这是一本由题目组成的书,整本书共52道题,基础+进阶各二十五道。

    在有了第一本书的基础上,再去解决这本书上的52道题,从易到难,还附带着详细的解题指导,不仅可以每天都更深入的学习Python,还会让自己每天的学习都会有一个满意的结果。

    据读者反映,每天抽一小时做一下题就能收获很多Python中的知识点。

    第三要点,直接找工作,与自身利益挂钩

    也许不是所有人学Python都不是为了找工作,但都不会拒绝与自身相关的利益,所以这本书可以带你深入Python的某个方向学习,并找到相应的工作。
    在这里插入图片描述
    这本书的名字叫《Python web开发实战》,是一本从0开始讲述到完成一个成熟web产品的实战书,并且该书的内容循序渐进,从易到难,不仅涉及到Python web开发的知识点全面系统,还会手把手的教你完成自己的web产品。

    书中不仅理论完善,还有很多大大小小的项目,按照书中的步骤就能完成这些项目,并做出自己的web产品。

    做出了自己的web产品,这不仅是给自己学习Python一个满意的结果,并且带着这些项目经验找到一份Python web开发的工作,然后再继续学习Python中的其他方向,这才是适合每个人的学习方法

    这三本书,分三个要点,先后学习,即是初学者学Python最合理的方法,如果还没有这三本书,且需要这三本书的话,可以加我wx:chen17673492042,即可免费获取这三本书的电子版,看懂这个方法和学习策略,才是学好!

  • 您还可以看一下 董付国老师的Python可以这样学(第一季:Python内功修炼)课程中的 字典应用案例:电影评分与推荐小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    问题分析: 根据题目描述,可能存在的问题和需要优化的地方包括:

    1.字典学生成绩统计代码存在问题,需要分析代码并解决问题;

    2.输出格式需要被更改为正确的格式。

    解决方案: 1.对于Python字典学生成绩统计代码,以下是可能出现问题的地方和对应的解决方案:

    (1)可能需要在代码开始处导入 sys 库,用于接收命令行参数。

    import sys
    

    (2)可能需要对命令行参数进行判断,如果未输入相应的文件名或文件不存在,则给出提示信息并退出程序。

    if len(sys.argv) < 2:
        print("请输入文件名作为命令行参数!")
        sys.exit(0)
    
    filename = sys.argv[1]
    if not os.path.isfile(filename):
        print("文件不存在!")
        sys.exit(0)
    

    (3)可能需要读取数据文件并将其存储到 Python 字典中,统计学生成绩并输出结果。

    scores = {}
    with open(filename, 'r', encoding='utf-8') as f:
        for line in f:
            items = line.strip().split(',')
            name = items[0]
            score = int(items[1])
            if name not in scores:
                scores[name] = []
            scores[name].append(score)
    
    for name, scores in scores.items():
        avg_score = sum(scores) / len(scores)
        print("{} 的平均成绩为 {:.1f}".format(name, avg_score))
    

    2.对于输出格式的优化,可以使用字符串格式化的方式将输出格式更改为正确的格式。

    for name, scores in scores.items():
        avg_score = sum(scores) / len(scores)
        print("{:<10s}的平均成绩为{:.1f}分".format(name, avg_score))
    

    完整代码如下:

    import os
    import sys
    
    if len(sys.argv) < 2:
        print("请输入文件名作为命令行参数!")
        sys.exit(0)
    
    filename = sys.argv[1]
    if not os.path.isfile(filename):
        print("文件不存在!")
        sys.exit(0)
    
    scores = {}
    with open(filename, 'r', encoding='utf-8') as f:
        for line in f:
            items = line.strip().split(',')
            name = items[0]
            score = int(items[1])
            if name not in scores:
                scores[name] = []
            scores[name].append(score)
    
    for name, scores in scores.items():
        avg_score = sum(scores) / len(scores)
        print("{:<10s}的平均成绩为{:.1f}分".format(name, avg_score))
    

    输出结果参考:

    张三        的平均成绩为91.5分
    李四        的平均成绩为85.0分
    王五        的平均成绩为92.5分
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

回答部分参考、引用ChatGpt以便为您提供更准确的答案:

根据您提供的代码和截图,我注意到您的代码存在一些问题,导致输出格式有误。以下是对代码问题的具体分析和修改建议:

  1. 在第一行代码中,您使用了eval(input())来获取输入的字典数据。虽然这种方法可以将输入的字符串作为代码进行求值并转换为字典,但是它存在安全风险,可能会导致恶意代码执行。为了安全起见,建议使用json模块来解析输入的字符串,例如使用d = json.loads(input())
  2. 在第6行和第9行的代码中,您分别将字典的键值对存储在了lsVKlsKV中。然而,由于字典是无序的数据结构,您可能无法保证lsVKlsKV中的键值对的顺序与您期望的一致。为了确保顺序正确,建议使用collections.OrderedDict来保存键值对的顺序。
  3. 在第13行的计算平均分的代码中,您使用了sum作为变量名,但是sum是Python的内置函数,不建议将其用作变量名。可以将变量名修改为total_sum
  4. 在第15行和第19行的输出语句中,您分别使用了lsKV[0]lsKV[1]来获取最高分的键值对。然而,字典是无序的,不能保证键值对的顺序与您期望的一致。为了获取最高分的键值对,可以使用collections.OrderedDict中的popitem()方法来获取最后一个键值对。

综上所述,以下是对您的代码进行修改的建议:

import json
from collections import OrderedDict

data = input()
d = json.loads(data)

lsVK = [(v, k) for k, v in d.items()]
lsVK.sort(reverse=True)

lsKV = OrderedDict([(k, v) for v, k in lsVK])

print(lsKV)

n = len(lsVK)
total_sum = sum(lsKV.values())
average = total_sum / n
print("平均分={:.2f}".format(average))

print("最高分:")
key1, value1 = lsKV.popitem()
print(key1, value1)

key2, value2 = lsKV.popitem()
print(key2, value2)

通过以上修改,您的代码应该能够输出正确的格式了。请注意,代码的逻辑和细节可能需要根据您的实际需求进行调整。