Я просматривал "Обработка текста в Python" и попробовал пример о сортировке Шварца.
Я использовал следующую структуру для выборочных данных, которая также содержит пустые строки. Я отсортировал эти данные по пятому столбцу:
383230 -49 -78 1 100034 '06 текст '9562' текст '720' текст '867
335067 -152 -18 3 100030 'текст' 2400 'текст' 2342 'текст' 696
136592 21 230 3 100035 '03. текст '10368' текст '1838' текст '977
Код, используемый для сортировки по Шварцу:
for n in range(len(lines)): # Create the transform
lst = string.split(lines[n])
if len(lst) >= 4: # Tuple w/ sort info first
lines[n] = (lst[4], lines[n])
else: # Short lines to end
lines[n] = (['\377'], lines[n])
lines.sort() # Native sort
for n in range(len(lines)): # Restore original lines
lines[n] = lines[n][1]
open('tmp.schwartzian','w').writelines(lines)
Я не понимаю, как автор предполагал, что короткие или пустые строки должны идти в конец файла с помощью этого кода. Строки сортируются после структуры if-else, в результате чего пустые строки поднимаются в начало файла. Короткие строки, конечно, работают так, как предполагалось, с помощью пользовательской сортировки (функция четвертое слово), реализованной в примере.
Это меня сейчас беспокоит, так что есть идеи? Если я прав в этом, то как бы вы обеспечили, чтобы короткие строки действительно оставались в конце файла?
РЕДАКТИРОВАТЬ: Я заметил квадратные скобки вокруг \ 377. Это испортило sort (), поэтому я снял эти скобки и вывод начал работать.
else: # Short lines to end
lines[n] = (['\377'], lines[n])
print type(lines[n][0])
>>> (type 'list')
Я принял ответ Носкло за хорошее разъяснение значения «\ 377» и за его улучшенный алгоритм. Большое спасибо и за другие ответы!
Если любопытно, я использовал образец файла размером 2 МБ, который занимал 0,95 секунды с пользовательской сортировкой и 0,09 с с сортировкой Шварца при создании идентичных выходных файлов. Работает!