2015-02-27 2 views
0

Я пытаюсь написать процедуру для чтения значений из текстового файла (имена и оценки), а затем иметь возможность сортировать значения az по наименованию, от наивысшего до самого низкого и т. Д. . Я могу сортировать данные, но только по позиции в строке, что нехорошо, когда имена различной длины. Это код, который я написал до сих пор:Сортировка значений списка, считанных в список из файла

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 Jess , 8,8,6 Dave, 4,3,8 Ed, 3,3,4

Я могу сортировать по nam e, но не на счет 1, 2 или 3. Что-то очевидное, возможно, но я не смог найти пример, который работает одинаково.

Thanks

+0

Непонятно, что вы спрашиваете. Что вы имеете в виду _not на счет 1, 2, 3_? – Secret

+0

Итак, у вас есть список имен, за которыми следуют некоторые значения, и вы хотите, чтобы строки сортировались по имени, а затем в каждой строке, вы хотите, чтобы значения также сортировались? – David

ответ

0

Я думаю, что понимаю, что вы просите. Я не специалист по профессии, но здесь идет:

Предполагая, что вы хотите сортировать строки по имени, первому int, второму int или третьему int, вы должны понимать, что когда вы создаете список, вы не создаете двумерный список, а список строк. Благодаря этому, вы можете рассмотреть вопрос об изменении вашей лямбды на что-то больше, как это:

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

Это предполагает, что х определяются как одно из полей в строке с возможными значениями 0-3.

Единственная проблема, с которой я вижу, состоит в том, что list.sort() может сортировать оценку Фреда 10 как менее 2, но больше 0 (я, кажется, помню, что это то, как сортировка работала на ints, но я мог бы быть ошибиться).

+0

Приветствия - это с настройкой из вышеприведенного ответа, отсортировало его благодаря: 0) – MrD

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»)

+0

Спасибо, ребята, комбинация этого и wmckevitt исправила сортировку строковых объектов, теперь мне просто нужно сортировать в сортировке по алфавиту. – MrD