Python:为什么这个平均代码不起作用?

时间:2016-03-16 11:36:15

标签: python sorting csv

这里我试图编写从.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],[名称,类别,分数1,分数2,分数3]

非常感谢有关如何修复平均分数计算的任何建议,谢谢。

编辑:示例:

在以下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))

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

2 个答案:

答案 0 :(得分:2)

在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)
...

应该做的工作

答案 1 :(得分:0)

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