Страницы

Поиск по вопросам

вторник, 21 мая 2019 г.

Отсортировать список предложений по количеству букв и слов в python 2.7

Начинаю учить Python 2.7. Надо отсортировать список предложений по количеству букв и слов. song - собственно сам файл со списком.
Чтобы отсортировать, подозреваю, надо играться с key, но не хватает у меня пока мыслей, как именно.
song = sys.argv[1] w = open(song) for line in sorted(w, key = int(len(line))) print line


Ответ

Параметр key должен быть функцией, принимающей текущий элемент и возвращающей значение, по которому сортируем. В данном случае достаточно просто len (приведение длины к целому излишне, т.к. len и так возвращает целое число):
song = sys.argv[1] w = open(song) for line in sorted(w, key=len) print line
В более сложных случаях сортировки может понадобиться создать lambda-функцию (или даже выносить код в отдельную именованную функцию).
Для сортировки по количеству слов можно разбивать строку по пробельным символам с помощью метода строки split, и сортировать по количеству полученных кусков:
song = sys.argv[1] w = open(song) for line in sorted(w, key=lambda x: len(x.split())) print line
Чтобы отсортировать строки по количеству слов, а слова в строках по количеству букв, можно сделать так:
Сначала просто создаем список строк, каждую строку разбиваем на слова:
lines = [line.rstrip().split() for line in file]
Добавляем сортировку слов внутри строк (это та же строка, просто добавили сортировку):
lines = [sorted(line.rstrip().split(), key=len) for line in file]
Добавляем сортировку строк по количеству слов (заменяю генератор списка на итератор - круглые скобки вместо квадратных):
lines = sorted((sorted(line.rstrip().split(), key=len) for line in file), key=len)
Т.к. строки уже разбиты на слова, то еще раз делать split не нужно, а просто сортируем по длине списка.
Ну и при выводе на экран собираем списки слов обратно в целые строки:
for line in lines: print ' '.join(line)
Дополнение. Как правильно заметил jfs в комментариях к ответу, если файл сохранен например в utf-8 (вообще в любой не однобайтовой кодировке), то будет не подсчет символов, а подсчет байт, плюс не будет работать разбивка по юникодным пробельным символам.
Чтобы открыть файл в нужной кодировке, нужно использовать функцию io.open(). При открытии будет использоваться кодировка системы по-умолчанию. Чтобы использовать конкретную кодировку, можно указать ее при открытии:
import io ... w = io.open(song, encoding='utf-8')

Комментариев нет:

Отправить комментарий