Задание «Количество слов в тексте» (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))
Посчитать количество букв
Пользователь вводит список любых букв а программа считает сколько в том, что ввёл пользователь гласных букв. Цикл for использовать нельзя. Код который пробовал я:
a = [str(i) for i in input("Введіть необмежену кількість літер Українського алфавіту: ").split()] g = ["а", "о", "у", "е", "є", "і", "ї", "ю", "я", "А", "О", "У", "Е", "Є", "і", "Ї", "Ю", "Я"] b=a.count(g) print(b)
В итоге всегда пишет 0.
Отслеживать
48.1k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
Создание из списка словаря. Подсчет букв в списке
Мне нужно посчитать количество букв в списке и вывести на экран ту буквы — которая попадается в списке максимальное количество раз. Решение с подсчетом букв я вижу следующее:
list = ( ", ".join("%s : %s" % (i, a.count(i)) for i in sorted(set(a.lower())))).split(',') print(list)
Получается следующий список:
['a : 2', ' b : 1', ' c : 1', ' d : 3', ' g : 2', ' j : 2', ' p : 1']
Теперь, стоит задача вытащить из этого списка ту самую наиболее часто используемую букву. Мне кажется, что если я преобразую данный список в словарь, то по максимальному значению смогу получить требуемый результат.
, , и т.д.
Но вот незадача, я не могу понять, как это сделать?
Отслеживать
76.8k 6 6 золотых знаков 55 55 серебряных знаков 123 123 бронзовых знака
задан 11 июл 2017 в 19:43
413 2 2 золотых знака 6 6 серебряных знаков 21 21 бронзовый знак
В питоне нет типа символ, поэтому строка не является списком символов. Во многом похоже, но строка и список — разные типы.
12 июл 2017 в 6:11
@andy.37 в программировании слово «символ» часто используется, чтобы обозначить элемент строки (элемент текста). Точнее нужно было бы сказать, что строка это последовательность символов (так как слово «список» со встроенным типом list может путаницу вызвать). Но неформально можно и слово список использовать (как синоним «последовательность»). В общем случае, символом может быть и байт, и code unit, и code point и grapheme cluster, и glyph, и что-нибудь ещё в зависимости от среды и задачи). Пример: Как разбить строку на отдельные символы?
12 июл 2017 в 14:49
@jfs Я это все понимаю. Просто именно в питоне (впрочем не только в нем) строка — довольно «специальная» последовательность. И даже итерируясь по строке (забавное слово) for symbol in «abcd»: на каждом шаге мы будем получать именно строку, просто состоящую из одного символа (в отличие от большинства других языков). И свойства строки «abc» довольно сильно отличаются от свойств списка (последовательности) «символов» [‘a’, ‘b’, ‘c’]
Подсчет гласных и согласных в строке
Есть код, который запрашивает кол-во строк для ввода стихотворения, а затем считает общее кол-во гласных и согласных.
quest = int(input('Сколько будет строк? ')) gls = 0 sgl = 0 vse_gls = ["а", "е", "ё", "и", "о", "у", "ы", "э", "ю", "я"] count = 0 while quest > count: poem = input() for i in poem: if i.isalpha(): if i in vse_gls: gls += 1 else: sgl += 1 count += 1 print('Кол-во гласных:', gls) print('Кол-во согласных:', sgl)
Подскажите, как сделать, чтобы он считал гласные и согласные еще и отдельно для каждой строки?
Отслеживать
задан 3 фев 2022 в 18:26
Вячеслав Мамаев Вячеслав Мамаев
39 1 1 золотой знак 1 1 серебряный знак 8 8 бронзовых знаков
Перенесите оба оператора print внутрь цикла while (перед count += 1) и будете получить ответ по каждой строке. Только не забудьте после вывода еще и обнулять оба счетчика, разумеется.
3 фев 2022 в 20:08
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
Немного избыточен ваш код.
Первое, не зачем считать количество строк. Для while необходимо определить условие выхода и все. Причина в том, что у вас не определяется поведение если будет расхождение когда вы определеяете количество строк, а потом когда вводите эти строки. Здесь в легую можно ошибиться. И даже если программа введет себя корректно, то, что будет если я введу количество строк в пару миллиардов. Шутников много, поэтому не стоит давать им шанс). Конечно, если это только не условие задачи.
Второе, для каждой строки считать количество гласных и согласных и помещять в списки. В конце суммировать и будет общий результат.
Третье, строку можно очистить от всего ненужного и привести к строчным буквам
gls = "аеиоуюя" gls_each_line = [] sgl_each_line = [] while True: line = input() if line: f = filter(str.isalpha, line) clear_letter_low = "".join(f).lower() gls_count = 0 for letter in gls: gls_count += clear_letter_low.count(letter) sgl_each_line.append(len(clear_letter_low) - gls_count) gls_each_line.append(gls_count) else: break for i in range(len(sgl_each_line)): s = f"В строке номер : гласных , с согласных " print(s) print(f"В тексте гласных и согласных")
Несколько комментариев по коду.
- gls_each_line и sgl_each_line переменные будут копить количество гласных и согласных для каждой строки
- while будет запрашивать строку до тех пор пока, не получит пустую строку, т.е. нажмите Enter и программа завершится
- Для того чтобы очистить строку применяю фильтр только по буквам, результат работы фильтра привожу к строчным буквам и кладу в переменную clear_letter_low
f = filter(str.isalpha, line) clear_letter_low = "".join(f).lower()
Пример, как это работает
line = "Не важно какаЯ СТРОКа 78900 и ЧТОБЫ она не сОДЕРжала" f = filter(str.isalpha, line) clear_letter_low = "".join(f).lower() print(clear_letter_low) # out # неважнокакаястрокаичтобыонанесодержала
на выходе имеем только буквы в нужном регистре.
- Считаем гласные -> помещяем в накопитель gls_each_line . Из длины чистой строки вычитаем количество гласных и результат помещяем в sgl_each_line
- Чтобы вывести количество гласных/согласных из всего текста, просто применяем метод для суммирования элементов списка sum()
# входные данные Затем генератор распаковывается в готовую вляются неизменяемыми объектами, поэтому все вышеуказаные методы убирает символы з данной строки и возвращает новую, они не меняют состояние # выходные данные В строке номер 1: гласных 16, с согласных 21 В строке номер 2: гласных 16, с согласных 20 В строке номер 3: гласных 14, с согласных 21 В строке номер 4: гласных 23, с согласных 26 В тексте 69 гласных и 88 согласных