# Строки и форматирование
Вы уже умеете выводить на экран текст, складывая строки. А вот как напечатать без этого? Нужно в скобках функции print() перечислить через запятую аргументы, которые она печатает:
Запятая между аргументами по умолчанию заменяется на пробел.
Это значит, что в сообщения можно не добавлять пробелы, когда составляете сложную фразу. Достаточно разделить аргументы функции print() запятой. И, что приятно, количество этих аргументов не ограничено:
# Упражнения
- Продолжим учить Виту вести беседы о погоде. Напечатайте на экран данные из списка weather_today в формате 'Сегодня гроза и на градуснике 21' . Вместо сложения строк и приведения чисел к строкам просто перечислите аргументы в скобках функции print() .
# Метод split()
Разбить фразу на слова, и вообще разделить строку по определённому символу можно методом split() (англ. «разделить»). В результате получится список строк. Метод split() принимает аргумент, указывающий, какой разделитель использовать.
Замечание. Да, Python позволяет использовать отрицательные индексы для обращения к элементам списка. При этом -1 соответствует последнему элементу, -2 — предпоследнему, и т.д. В общем случае, blok_list[-k] — это то же самое, что blok_list[len(blok_list) — k] , только короче. Например, если нужен пятый символ с конца списка s , можно написать s[len(s) — 5] или, короче, s[-5] . Если в вызове split() не указывать разделитель, то строка разобьётся по пробелам:
Тогда появятся лишние точки на концах слов. Их удобнее всего убирать методом strip() — он убирает указанные символы в начале и в конце.
# Упражнения
- Имеется список запросов queries . Необходимо определить, какие из них адресованы Вите, а какие — другим людям. Напишите функцию check_query() , которая принимает запрос как параметр, анализирует его и возвращает один из двух вердиктов:
- строку 'запрос к Вите', если запрос начинается с обращения к Вите,
- строку 'запрос к кому-то ещё', если нет.
Код вывода результатов на экран уже написан в основном теле программы.
- Вы умеете звать Виту. Теперь надо научить её распознавать суть запроса. Отделите обращения — перепишите функцию check_query() так, чтобы она возвращала: Например, для запроса 'Вита, сколько у меня друзей?' верните строку 'сколько у меня друзей?'. Для запроса 'Серёга, ты где?' — строку 'ты где?'. У строки, которую она возвращает, не должно быть пробелов в начале и конце.
# Форматирование строк
До сих пор для вывода текста на экран вам приходилось собирать его из нескольких частей. Но есть и другой способ. Для сборки текста из разных элементов удобны f-строки (от англ. formatted string, «форматированные строки»). Эти f-строки включают имена переменных внутри фигурных скобок. Значения переменных подставляются в строку автоматически. В коде f-строки выглядят как обычные, только начинаются с символа f перед кавычками:
Преобразование типов из числа в строку f-строки проделывают автоматически:
# Упражнения
- Замените объединение строк на f-строку.
- В коде финальной задачи из темы «Циклы и ветвления» замените все объединения строк на f-строки.
# Подробнее о форматировании
В f-строки можно подставлять не только переменные, но и результаты вычислений. Например, арифметические операции:
И обращение к элементам списка:
А также к элементам словаря по ключу:
Хоть Python и позволяет вставлять очень сложные выражения внутрь f-строк , не злоупотребляйте этой возможностью. Иначе получится перегруженный код, в котором будет сложно разобраться. Сравните два эквивалентных примера:
Второй намного понятнее, хотя строк стало в четыре раза больше. Не так ли? Лучше придерживаться общего правила: f-строки используются только для форматирования вывода, а вычислять все выражения надо вне их. И вообще, не стоит экономить на количестве строчек кода, принося в жертву его читаемость.
# Упражнения
- Научите Виту сообщать время в формате ЧЧ:ММ:СС (часы, минуты, секунды). Например На часах 19:28:06 .
- Вите передали список listened (англ. listen, "слушать") с хронометражем прослушанных песен в секундах. Выведите на экран суммарную статистику: 'Вы прослушали N песен.', где N — длина списка listened .
- Вите передали список listened (англ. listen, "слушать") с хронометражем прослушанных песен в секундах. Выведите на экран суммарную статистику:
'Вы прослушали N песен, общей продолжительностью M минут и S секунд.'
- N — длина списка listened ;
- M — количество целых минут общей продолжительности прослушанного;
- S — остаток от целых минут.
# Запросы к друзьям
В предыдущей теме «Словари и множества» вы добавили в код персонального ассистента Виты данные о том, где живут ваши друзья. И она уже умеет отвечать на следующие запросы:
- Сколько у меня друзей?
- Кто все мои друзья?
- Где все мои друзья?
Сейчас вам предстоит расширить возможности Виты. Научить её отвечать на вопросы про отдельных друзей. Начнём с самого простого вопроса «ты где?» — внутри Виты уже хранятся данные о местоположении. Если, например, Коля и Соня находятся в списке друзей, то запросы о них будет выглядеть следующим образом:
- Коля, ты где?
- Соня, ты где?
Чтобы различать вопросы про отдельных друзей от общих вопросов к Вите, будем начинать общие вопросы с прямого обращения, вот так:
- Вита, сколько у меня друзей?
- Вита, кто все мои друзья?
- Вита, где все мои друзья?
Тогда различать просто. Если вопрос начинается с имени "Вита", то это общий вопрос. А если с другого имени, то это вопрос про конкретного друга. Полагаем, правда, что у нас нет друзей по имени Вита.
# Упражнения
- Это код Виты, который вы последовательно писали на протяжении нескольких тем. Можете запустить его, вспомнить как выполняются запросы из списка queries .
А. Отредактируйте список запросов queries. Все запросы должны начинаться с обращения Вита:
- Вита, сколько у меня друзей?
- .
Б. Напишите функцию process_query(query) . Значение параметра query должно быть обработано методом split() . Отделите имя в начале от тела запроса (т.е., от оставшейся части).
Если запрос начинается с имени "Вита", то вызовите функцию process_anfisa() , передав в неё тело запроса как параметр. И верните результат выполнения этой функции. Если запрос начинается с другого имени, то пока ничего не делайте — это отложим до следующей задачи.
В. Измените в функции runner() вызов process_anfisa() на вызов process_query() .
- А. Напишите функцию process_friend(name, query) (англ. friend, "друг"), принимающую имя друга name и запрос query .
- Если друга с указанным именем Н нет в списке, то функция должна вернуть сообщение об ошибке У тебя нет друга по имени Н .
- Если запрос — "ты где?", то функция должна вернуть сообщения 'Н в городе Г', где Г определяется по данным словаря DATABASE .
- Если запрос не "ты где?", а какой-то другой, то функция должна вернуть сообщение об ошибке <неизвестный запрос>.
Б. Допишите функцию process_query() . Если запрос начинается не с "Вита", а с другого имени, то вызовите функцию process_friend(name, query) , передав в неё имя друга и тело запроса. И верните результат выполнения этой функции.
Подсчет повторений слов в тексте, деление строки на список слов
Для подсчета повторений слов в тексте необходимо научиться преобразовывать текст/сроку в список слов. Это можно сделать двумя способами:
Использовать метод строки str.split() и делить строку по пробелам между словами.
Использовать модуль re и делить строку по границам слов специальным символом регулярных выражений \W .
Подсчет повторений слов в тексте или символов в строке.
Подсчет повторений слов в тексте или символов в строке можно осуществить несколькими способами. Но для начала, если будем считать слова в тексте, необходимо этот текст подготовить, а именно очистить от знаков пунктуации и преобразовать его в список слов, как показано выше.
Для этого, возьмем готовый код замены пунктуации из подраздела "Удаление пунктуации из строки" и обернем в функцию text_clear() , далее получим из текста список слов и в цикле посчитаем сколько раз каждое слово встречается в исходном тексте.
Быстрый способ подсчета повторений элементов в последовательности.
Конечно это все прекрасно работает и хороший пример для самообучения но здесь много кода и к тому же в Python во встроенном модуле collections есть класс Counter() для целей подсчета повторений элементов в последовательности.
How do I split a string into a list of words?
How do I split a sentence and store each word in a list? e.g.
![]()
10 Answers 10
Given a string sentence , this stores each word in a list called words :
![]()
To split the string text on any consecutive runs of whitespace:
To split the string text on a custom delimiter such as "," :
The words variable will be a list and contain the words from text split on the delimiter.
![]()
Return a list of the words in the string, using sep as the delimiter . If sep is not specified or is None , a different splitting algorithm is applied: runs of consecutive whitespace are regarded as a single separator, and the result will contain no empty strings at the start or end if the string has leading or trailing whitespace.
Depending on what you plan to do with your sentence-as-a-list, you may want to look at the Natural Language Took Kit. It deals heavily with text processing and evaluation. You can also use it to solve your problem:
This has the added benefit of splitting out punctuation.
This allows you to filter out any punctuation you don’t want and use only words.
Please note that the other solutions using string.split() are better if you don’t plan on doing any complex manipulation of the sentence.
How about this algorithm? Split text on whitespace, then trim punctuation. This carefully removes punctuation from the edge of words, without harming apostrophes inside words such as we’re .
I want my python function to split a sentence (input) and store each word in a list
The str().split() method does this, it takes a string, splits it into a list:
If you want all the chars of a word/sentence in a list, do this:
![]()
shlex has a .split() function. It differs from str.split() in that it does not preserve quotes and treats a quoted phrase as a single word:
NB: it works well for Unix-like command line strings. It doesn’t work for natural-language processing.
Функции str.split и rsplit() в Python
Функция split() в Python используется для разделения строки на список строк на основе разделителя.
В качестве разделителя используется аргумент sep. Если строка содержит последовательные разделители, возвращается пустая строка. Аргумент-разделитель также может состоять из нескольких символов.
Если разделитель не указан или None, то в качестве разделителя рассматриваются пробелы. В этом случае пустая строка не будет возвращена, если в начале или в конце есть пробелы. Кроме того, несколько пробелов будут рассматриваться, как один разделитель.
Если предоставляется maxsplit, выполняется не более maxsplit (таким образом, список будет содержать не более maxsplit + 1 элементов). Если maxsplit не указан или -1, то количество разделений не ограничено, и все возможные разделения возвращаются в списке.
Пример
Давайте посмотрим на простой пример, где строка будет разделена на список на основе указанного разделителя.
split() с maxsplit
Обратите внимание, что в возвращенном списке всего 2 элемента, строка была разделена только один раз.
sep не указан или None
Начальные и конечные пробелы игнорируются в возвращаемом списке. Кроме того, последовательные пробелы также считаются одним разделителем.