【发布时间】: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。 -
放一些看似返回奇怪平均结果的简单示例。