Есть ли возможность использовать else в сокращённой форме цикла for?

1 for x in input() if x in 'aeiou'
вот сюда нужно добавить else
я сделал обычным циклом

for x in text.lower():
    if x in 'aeiouy':
        vowels += 1     
    else:
        consonants += 1

Мне интересно, нельзя ли использовать укороченный вариант. Попробовал вот так:

vowels = sum(1 if x in 'aeiou' else consonants += 1) for x in input()

Выдаёт ошибку invalid syntax.


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

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

В генераторах последовательностей если вы пишите if после цикла, то он служит фильтром для выходной последовательности, и писать там else нельзя. Да и что бы оно там означало, если if управляет по генератором по True/False.

a = [x for x in [0, 1, 2, 3] if X > 1]
# на выходе a = [2, 3]

Если if стоит до цикла, то он управляет значением, которое попадёт в выходную последовательность, и else там быть обязано (т.к. в последовательность что-то же должно попасть.

a = ["A" if x > 2 else "B" for x in [0, 1, 2, 3] ]
# на выходе a = ["B", "B", "B", "A"]

И можно оба варианта комбинировать.

a = ["A" if x > 2 else "B" for x in [0, 1, 2, 3] if x > 1]
# на выходе a = ["B", "A"]

Можно, конечно, из академического интереса изгольнуться и сделать вычисления нескольких переменных в одной последовательность. Но у такого кода читаемость сильно хромает.

vowels, consonants = map(sum, (zip(*((1,0) if x in 'aeiouy' else (0,1) for x in input()))))
→ Ссылка
Автор решения: SergFSM

как метко выразился @GrAnd в комментариях, можно "испитониться" и засунуть вычисления обеих переменных в одну строчку, еще таким способом:

text = 'my test text'
v = c = 0

[(v:= v+1) if i in 'aeiouy' else (c:= c+1) for i in text.lower()]

print(f'{v=}, {c=}')  # v=3, c=9

справедливости ради, надо заметить, что ваш код (как и этот) считает не количество гласных и согласных в тексте, а количество гласных и НЕгласных.

→ Ссылка