【问题标题】:Python: Why did this averaging code not work?Python:为什么这个平均代码不起作用?
【发布时间】:2016-07-02 06:25:51
【问题描述】:

在这里,我尝试编写一些代码,从 .csv 文件中提取数据,在 python 中创建一个列表对象以进行操作,并根据用户输入的内容以不同的方式对其进行排序。目前我已经成功地按字母顺序和分数对列表进行了排序,但是当我尝试按平均分数进行排序时,它返回了不正确的结果。数据库.csv。本身的格式没有列标题,格式为“名称、班级、分数、分数、分数”,每个条目之间有一个新行。这是我目前的代码:

    from operator import itemgetter

    import csv

    with open("Scoredatabase.csv","r") as f: #opens the file in read mode so it can be read
    formattedf=csv.reader(f) #creates the object from the csv. file that can be manipulated by python
    NameClassScoreList = [] 
    for line in formattedf: #Iterates through each entry in the .csv file
        NameClassScoreList.append(line[0:5]) # Creates a list of all of the entries in the .csv file (List of lists) in the order Name,Class,Score,Score,Score

print("If you would like to output a sorted list..")
print("Enter 'alpha' for an alphabetical score and the student's highest score")
print("Enter 'highscore' to sort by highest score to lowest")
print("Enter 'avgscore' to sort by average score")

while True:
    sortby=input()
    if sortby == "alpha" or sortby == "highscore" or sortby == "avgscore":
        break
    else:
        print("invalid input, please enter a specified sort method")

if sortby == "alpha":
    NameClassScoreList = sorted(NameClassScoreList, key=itemgetter(1,0))#sorts by class, then name alphabetically
    for entry in NameClassScoreList:
        print("Name: " + entry[0] + " Class: " + entry[1] + " Max score: " + str(max(entry[2:5]))) 

if sortby == "highscore":
    for entry in NameClassScoreList:
        entry.append(max(entry[2:5]))
    NameClassScoreList = sorted(NameClassScoreList, key = itemgetter(5))
    for entry in NameClassScoreList:
        print("Maximum Score: " + str(entry[5]) + " Name: " + entry[0] + " Class: " + entry[1])

if sortby == "avgscore":
    for entry in NameClassScoreList:
        entry.append((1/3)*int(((entry[2])+(entry[3])+(entry[4]))))
    NameClassScoreList = sorted(NameClassScoreList, key = itemgetter(5))
    for entry in NameClassScoreList:
        print("Average score: " + str(entry[5]) + " Name: " + entry[0] + " Class: " + entry[1])

这段代码从最低到最高返回非常奇怪的极大结果,当我想从最高到最低显示它时。

编辑 ^ 排序问题已修复,但程序仍会返回大得离谱的平均结果。列表中的条目(.csv 文件中的一行)看起来类似于 ...,[JOHN,A,20,30,40],[Name,Class,Score1,Score2,Score3]

任何关于如何修正平均分计算的建议将不胜感激,谢谢。

编辑:示例:

在以下 csv 文件中:https://i.gyazo.com/0615f6c4ec669d5c052ed061e5e871c9.png

Python 在我请求 avgscore 排序时输出:

平均分:118183.33333333333 姓名:DAN 班级:A 平均分:118183.33333333333 姓名:STEVE 班级:B 平均分:117336.66666666666 姓名:DAN 班级:B 平均分:117020.0 姓名:AARON 班级:C 平均分:101346.66666666666 姓名:AARON 班级:A 平均分:101346.66666666666 姓名:JOHN 班级:B 平均分:68183.33333333333 姓名:JOHN 班级:C 平均分:51516.666666666664 姓名:ROB 等级:C 平均分:34010.0 姓名:JOHN 班级:A

...有点奇怪

编辑:

我设法通过更改行来修复代码

    entry.append((1/3)*int(((entry[2])+(entry[3])+(entry[4]))))

    entry.append(int((int(entry[2])+int(entry[3])+int(entry[4])) / 3))

我想知道为什么它会修复它,因为它对我来说似乎不是很明显......

【问题讨论】:

  • 请将(1/3)*int(entry[2]+entry[3]+entry[4]) 更改为float(entry[2]+entry[3]+entry[4]) / 3.0。在旧版本的 Python 中,前一个表达式将被视为一个整数,结果为 0
  • 放一些看似返回奇怪平均结果的简单示例。

标签: python sorting csv


【解决方案1】:

在 sorted 中使用reverse 选项:

if sortby == "alpha":    
    NameClassScoreList = sorted(NameClassScoreList, key=itemgetter(1,0), reverse=True)
   ...
if sortby == "highscore":
...
    NameClassScoreList = sorted(NameClassScoreList, key = itemgetter(5), reverse=True)
...

应该做的工作

【讨论】:

  • 谢谢,这解决了订购问题,剩下的就是平均分计算。尽管文件中的分数在 0 到 60 之间,但程序返回的“平均值”值超过 100,000。
【解决方案2】:

经过几天的思考,我查看了它产生的数字,我相信它等于所有分数的三分之一,连接在一起而不是相加。所以实际上,将每个条目转换为整数解决了问题,我猜“maxscore”排序方法有效,因为“max”函数必须在我不知道的情况下将字符串隐式转换为数字。

【讨论】:

    猜你喜欢
    • 2017-04-09
    • 2019-12-11
    • 2019-12-02
    • 1970-01-01
    • 2018-11-05
    • 2012-02-22
    • 2023-03-03
    • 2017-10-02
    • 2016-07-10
    相关资源
    最近更新 更多