Как найти слова, у которых количество гласных равно количеству согласных и их порядковые номера

510 просмотра
0
0 Комментариев

Дана следующая строка:

So she was considering in her own mind, as well as she could, for the
hot day made her feel very sleepy and stupid, whether the pleasure
of making a daisy-chain would be worth the trouble of getting up and
picking the daisies, when suddenly a White Rabbit with pink eyes ran
close by her.

Как найти слова, у которых количество гласных букв равно количеству согласных?
Как найти порядковые номера этих слов?

Строку необходимо инициализировать в коде программы.


Добавить комментарий

1 Ответы

Python Опубликовано 16.12.2018
0

В принципе, не важно, на каком языке программирования реализовывать решение данной задачи. Важно понять алгоритм.
Подходящий под решение задачи автора выглядит так:

  • Составить список гласных букв
  • Составить список согласных букв
  • Разбить строку на список слов
  • Найти количество пересекающихся элементов среди букв в слове и списка гласных
  • Найти количество пересекающихся элементов среди букв в слове и списка согласных
  • Сравнить количество гласных и согласных букв в слове

Согласно Википедии, важно помнить следующее:

Буква Y может быть как гласной (в таких словах, как: «cry», «sky», «fly» или «why»),
так и согласной (в таких словах, как: «yellow», «yacht», «yam» или «yesterday»).


Реализация для варианта, когда Y гласная:

# coding=utf-8
import re
 
s = 'So she was considering in her own mind, as well as she could,' \
    + ' for the hot day made her feel very sleepy and stupid, whether the pleasure' \
    + ' of making a daisy-chain would be worth the trouble of getting up' \
    + ' and picking the daisies, when suddenly a White Rabbit with pink eyes' \
    + ' ran close by her.'
# Определяем списки согласных и гласных букв
vowels = list("aeiouyAEIOUY")
consonants = list("bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ")
 
# С помощью регулярного выражения разбиваем строку на слова
words = re.findall(r'([a-zA-Z]+(?:[\'-][a-zA-Z]+)*)', s)
 
# enumerate нужен для получения индекса слова в строке
for index, word in enumerate(words):
    # Считаем количество гласных/согласных букв в слове
    number_of_vowels = sum(x in vowels for x in word)
    number_of_consonants = sum(x in consonants for x in word)
    # Если количество согласных и гласных букв равно,
    # то выводим порядковый номер текущего слова.
    # Помним, что индекс начинается с 0, а порядковые номера с 1. Нивелируем эту разницу.
    if number_of_vowels == number_of_consonants:
        print(index + 1, word)

При написании этого ответа я воспользовался этим ответом на SO:
Count duplicates between 2 lists


Update

Исправления:

  • Исправлена ошибка, из-за которой некорректно обрабатывались слова с повторяющимися буквами
  • Исключено использование метода .lower()
  • Исправлена путаница между звуками и буквами в ответе
  • Удалено ошибочное высказывание о простоте алгоритма реализации
  • Добавлено замечание о том, что решение не является универсальным для всех случаев

Ограничения:

  • В данной реализации словом считается набор букв [a-zA-Z], между которыми может быть дефис или одинарная кавычка.
  • В данной реализации аббревиатуры и слова, написанные транскрипцией, не анализируются.

Большое спасибо пользователю @jfs за дельный комментарий, в котором он верно подметил ошибки и недочеты в моем ответе.
Рекомендую ознакомиться с его ответом на вопрос Finding out if half the letters in a word are vowels на SO.

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up