我正在从文本文件中读取数据,并希望按gpa排序数据。我写了以下代码
import string
def main() :
my_list = []
# open the input file for reading
filename = raw_input("Enter name of the grade file: ")
infile = open(filename, 'r')
print infile
# process subsequent lines of the file
for line in infile :
name, hours, qpoints = line.split('\t')
gpa = float(qpoints)/float(hours)
my_tuple = (name, gpa)
print name, gpa
my_list += my_tuple
data = sorted(my_list, key = lambda x: gpa)
if __name__ == '__main__' :
main()
我在main()
中收到错误我发现'line.split('\ t')没有给出我期望的输出。我不确定我做错了什么。我想,在我尝试添加camparison函数cmpGpa之前,我会先完成第一部分工作。感谢您的帮助。
答案 0 :(得分:1)
在new_id = (st.getName, st.getGpa)
中调用函数后,您已忘记了parantheses。将其更改为new_id = (st.getName(), st.getGpa())
,我认为你会更好。
关于st = makeStudent(line)
的代码似乎没有问题 - 我猜你的输入文件存在一些问题。尝试打印每一行,看看输出是否符合预期。如果这看起来不错,请尝试在分割线后打印变量,看看是否符合您的要求。你可能会在某个地方找到一个小虫子。
您可以考虑的其他几件事情:
使用key
对数据进行排序比cmp
更容易faster(参见注释8),并且是自Python 2.4以来排序列表的preferred way 。
在您的情况下,sorted(your_list, key=lambda x: x.getGpa())
将根据其gpa对学生实例列表进行排序。
如果gpa值是静态的(hours
且qpoints
未更改),则应考虑在__init__
中对gpa进行计算。你每次访问它时为什么要重新计算它?如果初始化后hours
或qpoints
可能会发生变化,那么在设置新值后,您可能更好地制作一些更新gpa的set_variable
方法。
除非您有充分理由实施这些方法,否则请删除get_variable_name
课程中的Student
方法。正如代码现在所示,我认为不需要它们,只需直接访问变量即可。