对列表值进行排序从文件中读入列表

时间:2015-02-27 00:11:20

标签: python list sorting sorted

我正在尝试编写一个例程来读取文本文件中的值(名称和分数),然后能够按名称,从最高到最低等对值进行排序。我能够对数据进行排序,但只能通过字符串中的位置,名称长度不同,这是不好的。这是我到目前为止编写的代码:

ClassChoice = input("Please choose a class to analyse Class 1 = 1, Class 2 = 2")
if ClassChoice == "1":
    Classfile = open("Class1.txt",'r')
else:
    Classfile = open("Class2.txt",'r')
ClassList = [line.strip() for line in Classfile]
ClassList.sort(key=lambda s: s[x])
print(ClassList)

这是其中一个数据文件的示例(每个数据都在一个单独的行上):

鲍勃,8,7,5 弗雷德,10,9,9 简,7,8,9 安妮,6,4,8 马迪,8,5,5 吉姆,4,6,5 迈克,3,6,5 杰斯,8,8,6 戴夫,4,3,8 版,3,3,4

我可以对名称进行排序,但不能对得分1,2或3进行排序。可能有些明显但我无法找到以相同方式工作的示例。

由于

2 个答案:

答案 0 :(得分:1)

这样的事情怎么样?

indexToSortOn = 0 # will sort on the first integer value of each line
classChoice = ""
while not classChoice.isdigit():
    classChoice = raw_input("Please choose a class to analyse (Class 1 = 1, Class 2 = 2) ")
classFile = "Class%s.txt" % classChoice
with open(classFile, 'r') as fileObj:
    classList = [line.strip() for line in fileObj]
classList.sort(key=lambda s: int(s.split(",")[indexToSortOn+1]))
print(classList)

关键是在键函数中指定您传递的每个字符串(行)的哪一部分要排序:

classList.sort(key=lambda s: int(s.split(",")[indexToSortOn+1]))

强制转换为整数很重要,因为它确保排序是数字而不是字母数字(例如100> 2,但是“100”<“2”)

答案 1 :(得分:0)

我想我明白你在问什么。我不是一个排序专家,但这里有:

假设您希望能够通过名称,第一个int,第二个int或第三个int对行进行排序,您必须意识到在创建列表时,您不是在创建二维列表,但是一个字符串列表。因此,您可能希望考虑将lambda更改为更像这样的内容:

ClassList.sort(key=lambda s: str(s).split(',')[x])

这假定x被定义为行中可能值为0-3的字段之一。

我看到的一个问题是list.sort()可能将Fred的得分10分为小于2但大于0(我似乎记得这是对整数的影响,但我可能会弄错)。