Подсчет числа гласных в строке

Необходимо написать программу, которая считает количество гласных букв в слове. Главное требование - использование while
Я вроде все написал правильно, однако не понимаю, почему мой код не работает, может у вас есть идеи или другие способы реализации?

x = list('привет')
slovo = []
for i in range(len(x)):
    y = x[i].lower()
    slovo.append(y)
b = set('уеыаоэяию')
g = 0
i = 0
while i < len(slovo):
    for letter in slovo:
        if letter in b:
            g += 1
s = len(x) - g
print('Количетсво гласных:', g)
print('Количество согласных:', s)

Ответы (3 шт):

Автор решения: Zhihar

для слова конечно кол-во гласных + кол-во согласных равно длине слова, для предложения уже не так (поскольку есть пробелы и прочие знаки)

такой код устроит?

text = 'Текст с гласными (и скобками)!'
vowels = 'аеёиоуэюя'
consonants = 'бвгджзйклмнпрстфхцчшщьъ'

vowels_count = 0
consonants_count = 0

pos = 0
while pos < len(text):
    if text[pos] in vowels:
        vowels_count += 1

    if text[pos] in consonants:
        consonants_count += 1

    pos += 1
    
print(f'Количетсво гласных: {vowels_count}')
print(f'Количество согласных: {consonants_count}')

хотя через for код чуть покороче:

vowels_count = 0
consonants_count = 0

for letter in text:
    if letter in vowels:
        vowels_count += 1

    if letter in consonants:
        consonants_count += 1

а если использовать тернарные операторы, то можно вообще короткий сделать (для while это тоже подходит)

vowels_count = 0
consonants_count = 0

for letter in text:
    vowels_count += letter in vowels
    consonants_count += letter in consonants

А если хочется совсем коротенького, тогда:

vowels_count = sum(letter in vowels for letter in text)
consonants_count = sum(letter in consonants for letter in text)

P.S.

не делал перевод в нижний регистр, но если хочется, то

text = text.lower()
→ Ссылка
Автор решения: Evil Giraffe
const = 'уеыаоэяёию'
while True:
    print(sum(map(lambda x: 1 if x in const else 0, list(input().lower()))))
    break

Не, ну а что? While же есть...

→ Ссылка
Автор решения: xmikex

Вот можно так можно, но идея для юникода не очень в общем-то. Хотя думаю, что должна быть библиотека для юникода, которая нормально определяет является ли буква гласной. Вот если такое есть, то просто применить filter с такой функцией и потом подсчитать размер получившегося в результате списка.

letters=[False]*256
vowels=('уеыаоэяиюё')
init_pos=ord('а')

for i in range(len(vowels)-1):
    letters[ord(vowels[i])-init_pos]=True
    
def is_vowel(letter):
    return letters[ord(letter)-init_pos]

word=str(input()).lower()
vowel_word=list(filter(is_vowel,word))
print(len(vowel_word))
→ Ссылка