Сколько слов заканчивается определенным символом в функции, вызывающей другой файл?

Итак, я пытаюсь создать небольшую функцию, которая принимает имя файла в качестве аргумента и возвращает, сколько СЛОВ в файле заканчивается на «!», «?» или ".".

До сих пор я пробовал следующее:

def count_possible_sentences(file_name):
    with open(file_name) as wordfile:
        text_str = wordfile.read()
        word_list = text_str.split()
    count = 0
    for ch in word_list:
        if ch in "!?.":
            count += 1
    return count

но это не работает и не учитывает, сколько отдельных СЛОВ заканчиваются указанными символами в отдельном вызываемом файле. Я думал о разделении каждого слова и переборе каждого символа, и если он содержит один из символов, он добавляет +1 к счету, но я не уверен, как это сделать.

редактировать: также думали об использовании .count? это сработает? ваше здоровье

редактировать2: вот мои доктесты, которые я пытаюсь пройти:

def count_possible_sentences(file_name):
    """
    >>> count_possible_sentences("frances_oldham_kelsey.txt")
    45
    >>> count_possible_sentences("ernest_rutherford.txt")
    32
    >>> count_possible_sentences("marie_curie.txt")
    24
    """

и вот ссылка на .txt, который не работает: https://pastebin.com/raw/1NYPeY29

там написано ожидаемо: 45 получено: 52

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
449
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Использовать:

def count_possible_sentences(file_name):
    count = 0
    with open(file_name) as wordfile:              #Open file for read
        for line in wordfile:                      #Iterate each line
            for word in line.strip().split():      #Get words
                if word.endswith(("!", "?", ".")):  #Check if word ends with
                    count += 1
    return count

Не знал str.endwith принимает на проверку кортеж суффиксов! Отличное решение.

N Chauhan 29.05.2019 11:12

Линия...

if ch in '?!.':

... не будет работать, как ожидалось. Вам нужно проверить каждый знак препинания отдельно:

if any(ch.endswith(punc) for punc in '?!.'):
# or
if any(punc in ch for punc in '?!.'):

заменив его на if '!?.' в ch: все еще не работает, возвращает 0, когда я запускаю его с doctests

puppyonkik 29.05.2019 11:07

Я бы предложил что-то подобное, используя регулярное выражение. Я думаю, это то, что вы хотите сделать.

import re
pattern = "[a-zA-Z]+(!|\?|\.)"
string = "This! sent contains? 3 of those! words !!"
a = len(re.findall(pattern, string))
print(a) # 3

Вам нужно изменить оператор if:

def count_possible_sentences(file_name):
    with open(file_name) as word_file:
        text_str = word_file.read()
        word_list = text_str.split()
    count = 0
    for item in word_list:
        if '!' in item or '?' in item or '.' in item:
             count += 1
    return count

Вы можете сделать это одной строкой, если предпочитаете понимание списка. w[-1] in '!?.' проверяет последний символ слова.

def count_possible_sentences(file_name):
    return len([w for w in open(file_name).read().split() if w[-1] in '!?.'])

print(count_possible_sentences('input_file.txt'))

Другие вопросы по теме