Python: подсчёт количества каждой гласной

В этом примере посчитаем, сколько раз каждая английская гласная (a, e, i, o, u) встречается в строке. Покажу два решения: обычный цикл со словарём и компактный вариант на генераторах.


Что нужно знать


Пример 1: через словарь

# Program to count the number of each vowels

# string of vowels
vowels = 'aeiou'

ip_str = 'Hello, have you tried our tutorial section yet?'

# make it suitable for caseless comparisions
ip_str = ip_str.casefold()

# make a dictionary with each vowel a key and value 0
count = {}.fromkeys(vowels,0)

# count the vowels
for char in ip_str:
   if char in count:
       count[char] += 1

print(count)

Вывод

{'a': 2, 'e': 5, 'i': 3, 'o': 5, 'u': 3}

Разберём программу:

  1. В ip_str лежит исходная строка. Метод casefold() приводит её к виду, удобному для регистронезависимого сравнения (это «более агрессивный» вариант lower()).

  2. {}.fromkeys(vowels, 0) создаёт словарь, где ключи — гласные, а начальные значения — 0.

  3. Дальше идём по каждому символу строки. Если символ — это гласная (есть в ключах словаря), увеличиваем соответствующий счётчик на 1.


Пример 2: генератор словаря и списка

# Using dictionary and list comprehension

ip_str = 'Hello, have you tried our tutorial section yet?'

# make it suitable for caseless comparisions
ip_str = ip_str.casefold()

# count the vowels
count = {x:sum([1 for char in ip_str if char == x]) for x in 'aeiou'}

print(count)

Результат тот же, что и в первом примере.

Здесь использован вложенный приём: внешний генератор словаря перебирает все гласные, а внутренний генератор списка для каждой гласной строит список из единиц по числу её вхождений. Функция sum() складывает эти единицы — получается количество.


Как это работает

Оба решения дают одинаковый результат, но первый вариант делает один проход по строке, а второй — столько проходов, сколько у нас гласных. Поэтому второй компактный вариант на длинных строках работает медленнее, хотя выглядит элегантнее.