Ваша первая попытка была на полпути, но вы, кажется, застряли на сортировке.Когда вы вызываете sorted(f)
, на самом деле там происходит несколько вещей.
sorted
запрашивает у объекта f
что-то итерируемое, а f
возвращает набор строк, представляющих каждую строкуyour file.txt
- Затем строки были отсортированы на основе значений ascii каждого символа в лексикографическом порядке (отсортировано как словарь).
- Сортированные строки были помещеныв список и вернулся.
Большой вывод здесь заключается в том, что каждая строка была отсортирована по тексту, а не по числовому значению, спрятанному где-то посередине.
Если вы хотитедля сортировки с использованием встроенной функции sorted
(т. е. вы не хотите писать собственный алгоритм сортировки), вам необходимо либо реструктурировать свои данные так, чтобы метод сортировки по умолчанию давал вам нужный порядокили вам нужно указать функции sorted
, как немного изменить ее поведение по умолчанию.Последнее включает в себя указание параметра key
, переданного в sorted
, который охватили другие ответы.
Чтобы получить sorted
, чтобы сделать то, что мы хотим, из ворот, нам нужно дать ему значение, которое мыхочу отсортировать первым в каждой строке.Мы можем сделать это, извлекая число из каждой строки и помещая его сначала в список, а затем снова избавляясь от него после сортировки списка строк.
f = open("file.txt","r")
lines = list(f) #create a list of strings
f.close() #don't forget to close our files when we're done. It's good practice.
modified_lines = [] #empty list to put our modified lines in (extracted number, original line)
for line in lines: #iterate over each line
if line.strip(): #if there's anything there after we strip away whitespace
score = line.split(' ')[2] #split our text on every space and take the third item
score = int(score) #convert the string of our score into a number
modified_lines.append([score, line]) #add our modified line to modified_lines
#sort our list that now has the thing we want to sort based on is first
sorted_modified_lines = sorted(modified_lines)
#take only the string (not the number we added before) and print it without the trailing newline.
for line in sorted_modified_lines: print(line[1].strip())