Задание «Количество слов в тексте» (Python) — код занимается «приписками»
Нужно определить, сколько различных слов содержится в тексте. При этом словом считается последовательность символов идущих подряд (за исключением пробелов), слова разделены одним или большим числом пробелов или символами конца строки. Например, «Share» и «Share,» — это 2 разных слова. Мой вариант:
inFile = open('input.txt', 'r', encoding='utf8') a = str(inFile.readlines()) print(len(set(a.split())))
Тестовый текст:
She sells sea shells on the sea shore; The shells that she sells are sea shells I'm sure. So if she sells sea shells on the sea shore, I'm sure that the shells are sea shore shells.
должно получиться 19 слов, а у меня зачем-то 20 . где ошибка? Спасибо!
Отслеживать
задан 13 авг 2018 в 14:49
459 2 2 золотых знака 8 8 серебряных знаков 19 19 бронзовых знаков
Так посмотрите, что в set лежит
13 авг 2018 в 14:53
А посмотреть под отладкой? Вообще я не думаю что данный вопрос будет полезен будущим посетителям..
– user218976
13 авг 2018 в 14:53
Просто выведите полученный сет на экран и посмотрите, что там за лишнее слово.
13 авг 2018 в 14:59
@Anamnian ну, это не вам решать, а будущим посетителям.
13 авг 2018 в 15:02
@MBo спасибо за подсказку! символ переноса строки нужно было убрать
13 авг 2018 в 15:04
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Прхожий вариант, но немного короче:
In [250]: len(set(open(r'C:\Temp\a.txt').read().split())) Out[250]: 19
еще лучше будет воспользоваться pathlib :
from pathlib import Path In [251]: len(set(Path(r'C:\Temp\a.txt').read_text(encoding='utf-8').split())) Out[251]: 19
Отслеживать
ответ дан 13 авг 2018 в 15:19
MaxU — stand with Ukraine MaxU — stand with Ukraine
149k 12 12 золотых знаков 59 59 серебряных знаков 132 132 бронзовых знака
Варианты ошибок: в конце файла перенос строки, пробелы, табуляция, смотреть надо исходники. Мой вариант задачки, когда нужно отобрать слова как набор символов с хотя бы одной буквой (если надо, досыпьте в скобки русских буков, только Ёё не забудьте, ее нужно отдельно добавлять):
def word_conter(file_name: str) -> int: import re """ Returns the number of words in a text file or None in case of an error. Provided that the word is a sequence of characters in which there is at least one letter """ try: with open(file_name, 'rt') as f: s = (re.findall( r"\b(\w*[A-Za-z]+[!#$%&'\"*+-.^_`|~:\w]*)\b", f.read())) return len(s) except: return None if __name__ == "__main__": import sys # Pulls a file from the command line as a script run option. fname = sys.argv[1] print(word_conter(fname))
Как посчитать количество слов в предложении python
Рассмотрим работу со строками на небольшом примере, который будет представлять программу подсчета слов.
Пусть весь код программы будет выглядеть следующим образом:
# Программа подсчета слов в файле import os def get_words(filename): with open(filename, encoding="utf8") as file: text = file.read() text = text.replace("\n", " ") text = text.replace(",", "").replace(".", "").replace("?", "").replace("!", "") text = text.lower() words = text.split() words.sort() return words def get_words_dict(words): words_dict = dict() for word in words: if word in words_dict: words_dict[word] = words_dict[word] + 1 else: words_dict[word] = 1 return words_dict def main(): filename = input("Введите путь к файлу: ") if not os.path.exists(filename): print("Указанный файл не существует") else: words = get_words(filename) words_dict = get_words_dict(words) print(f"Кол-во слов: ") print(f"Кол-во уникальных слов: ") print("Все использованные слова:") for word in words_dict: print(word.ljust(20), words_dict[word]) if __name__ == "__main__": main()
Здесь в функции get_words() производится начальная сегментация текста на слова. Пи этом все пунктуационные знаки удаляются, а переводы стоки заменяется на пробелы. Затем происходит разбитие текста на слова. В качестве разделителя по умолчанию применяется пробел.
Далее в функции get_words_dict() получаем словарь из слов, где ключ — это уникальное слово, а значение — количество вхождений данного слова в тексте.
В функции main осуществляется ввод пути к файлу и вызов выше определенных функций, а также вывод все статистики.
Консольный вывод программы:
Введите путь к файлу: C:\SomeDir\hello.txt Кол-во слов: 66 Кол-во уникальных слов: 54 Все использованные слова: благодетель 2 в 1 всего 1 вы 1 горчичным 1 ее 1 ежели 3 еще 1 .
Как посчитать слова в строке python
Чтобы посчитать количество слов в строке, разобьём её на отдельные слова и посчитаем длину получившегося списка:
text = 'Hello! How are you?' words = text.split() # ['Hello!', 'How', 'are', 'you?'] len(words) # 4
Знаками препинания можно пренебречь, т.к. слова в предложении разделены пробелами.
05 июля 2022
Посчитать слова (буквенные последовательности разделенные пробелами) можно так
t = 'How to %#^ words in ćęźńśü in 123?' sum(1 for x in t.split() if x.isalpha()) # 6
Как посчитать количество слов в предложении python
Строка считывается со стандартного ввода функцией input() . Напомним, что для двух строк определена операция сложения (конкатенации), также определена операция умножения строки на число.
Строка состоит из последовательности символов. Узнать количество символов (длину строки) можно при помощи функции len .
Любой другой объект в Питоне можно перевести к строке, которая ему соответствует. Для этого нужно вызвать функцию str() , передав ей в качестве параметра объект, переводимый в строку.
На самом деле каждая строка, с точки зрения Питона, — это объект класса str. Чтобы получить по объекту другой объект другого класса, как-то ему соответствующий, можно использовать функцию приведения. Имя этой функции совпадает с именем класса, к которому мы приводим объект. (Для знатоков: эта функция — это конструктор объектов данного класса.) Пример: int — класс для целых чисел. Перевод строки в число осуществляется функцией int() .
What is the answer? 42
s = input() print(len(s)) t = input() number = int(t) u = str(number) print(s * 3) print(s + ' ' + u)
2. Срезы (slices)
Срез (slice) — извлечение из данной строки одного символа или некоторого фрагмента подстроки или подпоследовательности.
Есть три формы срезов. Самая простая форма среза: взятие одного символа строки, а именно, S[i] — это срез, состоящий из одного символа, который имеет номер i . При этом считается, что нумерация начинается с числа 0. То есть если , то , , , , .
Заметим, что в Питоне нет отдельного типа для символов строки. Каждый объект, который получается в результате среза S[i] — это тоже строка типа str.
Номера символов в строке (а также в других структурах данных: списках, кортежах) называются индексом.
Если указать отрицательное значение индекса, то номер будет отсчитываться с конца, начиная с номера -1 . То есть , , , , .
Или в виде таблицы:
| Строка S | H | e | l | l | o |
| Индекс | S[0] | S[1] | S[2] | S[3] | S[4] |
| Индекс | S[-5] | S[-4] | S[-3] | S[-2] | S[-1] |
Если же номер символа в срезе строки S больше либо равен len(S) , или меньше, чем -len(S) , то при обращении к этому символу строки произойдет ошибка IndexError: string index out of range .
Срез с двумя параметрами: S[a:b] возвращает подстроку из b — a символов, начиная с символа c индексом a , то есть до символа с индексом b , не включая его. Например, S[1:4] == ‘ell’ , то же самое получится если написать S[-4:-1] . Можно использовать как положительные, так и отрицательные индексы в одном срезе, например, S[1:-1] — это строка без первого и последнего символа (срез начинается с символа с индексом 1 и заканчиватеся индексом -1, не включая его).
При использовании такой формы среза ошибки IndexError никогда не возникает. Например, срез S[1:5] вернет строку ‘ello’ , таким же будет результат, если сделать второй индекс очень большим, например, S[1:100] (если в строке не более 100 символов).
Если опустить второй параметр (но поставить двоеточие), то срез берется до конца строки. Например, чтобы удалить из строки первый символ (его индекс равен 0), можно взять срез S[1:] . Аналогично если опустить первый параметр, то можно взять срез от начала строки. То есть удалить из строки последний символ можно при помощи среза S[:-1] . Срез S[:] совпадает с самой строкой S .
Любые операции среза со строкой создают новые строки и никогда не меняют исходную строку. В Питоне строки вообще являются неизменяемыми, их невозможно изменить. Можно лишь в старую переменную присвоить новую строку.
На самом деле в питоне нет и переменных. Есть лишь имена, которые связаны с какими-нибудь объектами. Можно сначала связать имя с одним объектом, а потом — с другим. Можно несколько имён связать с одним и тем же объектом.
Если задать срез с тремя параметрами S[a:b:d] , то третий параметр задает шаг, как в случае с функцией range , то есть будут взяты символы с индексами a , , и т. д. При задании значения третьего параметра, равному 2, в срез попадет кажый второй символ, а если взять значение среза, равное -1 , то символы будут идти в обратном порядке. Например, можно перевернуть строку срезом S[::-1] .
s = 'abcdefg' print(s[1]) print(s[-1]) print(s[1:3]) print(s[1:-1]) print(s[:3]) print(s[2:]) print(s[:-1]) print(s[::2]) print(s[1::2]) print(s[::-1])