#python #python-3.x
#python #python-3.x
Вопрос:
Мне трудно заставить функцию принимать значение, которое возвращает True, если параметр содержит 2 гласных рядом друг с другом и False в противном случае.
Вот что у меня есть до сих пор:
def insert_sv_present(ch):
lvowel = ['a' , 'e' , 'i','o' , 'u']
uvowel = ['A', 'E' , 'I' , 'O', 'U']
if(ch in lvowel) or (ch in uvowel):
return True
else:
return False
Комментарии:
1. Кажется, что ваша функция принимает символ, а не полную строку. Это правда?
2. Мне тоже так кажется, но нет смысла проверять наличие 2 гласных, если есть только 1 символ… Поэтому я предположил, что это строка.
Ответ №1:
Вам нужно перебирать символы в вашей строке и подсчитывать, сколько гласных следует друг за другом. Если количество равно 2, две гласные являются последовательными.
Как предположил @ S3DEV, код будет более чистым, как:
def insert_sv_present(ch):
lvowel = ['a' , 'e' , 'i','o' , 'u']
count = 0
for c in ch:
if c.lower() in lvowel:
count = 1
if count == 2:
return True
else:
count = 0
return False
Комментарии:
1. Как насчет упрощения до:
if c.lower() in lvowel
?2. Это, конечно, более чистый вариант, но я предпочитаю не изменять работающие строки, я все равно добавлю его.
3. Честная игра. И наоборот, часто мы можем использовать ответ, чтобы улучшить существующий код и познакомить новичков с лучшими / лучшими практиками.
Ответ №2:
Предполагая ch
, что это строка, а не символ, ваша проверка будет работать только в том случае, если ее размер равен 1
… Вам нужно фактически перебрать строку, чтобы найти два последовательных символа.
Поскольку в вопросе запрашиваются две последовательные гласные, мы можем использовать itertools
рецепт для зацикливания строки pairwise
:
import itertools
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
next(b, None)
return zip(a, b)
def insert_sv_present(s):
lvowel = ['a', 'e', 'i', 'o', 'u']
for pair in pairwise(s):
if pair[0].lower() in lvowel and pair[1].lower() in lvowel:
return True
return False
Который затем может быть немного уточнен и обобщен с помощью встроенной all()
функции:
def insert_sv_present(s):
lvowel = ['a', 'e', 'i', 'o', 'u']
for pair in pairwise(s):
if all(ch.lower() in lvowel for ch in pair):
return True
return False
Который может быть даже дополнительно уменьшен с помощью встроенной any()
функции, но этот шаг может граничить с нарушением удобочитаемости:
def insert_sv_present(s):
lvowel = ['a', 'e', 'i', 'o', 'u']
return any(all(ch.lower() in lvowel for ch in pair) for pair in pairwise(s))
Ответ №3:
insert_sv_present=lambda seq:True in [ch.lower() in 'aeiou' and seq[seq.index(ch.lower()) 1].lower() in 'aeiou' for ch in seq[0:-1]]
это однострочная
надежда, что это помогло вам!
ОТРЕДАКТИРОВАНО, есть небольшая оптимизация, предложенная @Tomerikoo
insert_sv_present=lambda seq:True in [seq[i].lower() in 'aeiou' and seq[i 1].lower() in 'aeiou' for i in range(len(seq)-1)]
Комментарии:
1. Почему бы не выполнять цикл
range(len(seq)-1)
вместо того, чтобы вызыватьindex
каждый раз?2. @Tomerikoo потому что в любом случае я бы использовал дополнительный код, в моем случае я использовал seq.index(ch) в вашем случае я бы добавил диапазон, а также seq[index] вместо моего ch
3. Да, но вы понимаете, что каждый вызов
index
повторяет список снова и снова? Вместо этого просто сделайтеfor i in range(len(seq)-1)
и заменитеch
наseq[i]
и, что более важно, заменитеseq[seq.index(ch.lower()) 1]
на простойseq[i 1]
…4. Хорошо, я понял. Но в любом случае оба решения хороши и работают одинаково. если вы думаете иначе, возможно, есть другое решение, которое лучше моего и вашего, просто я предложил решение, которое я нашел, не самое лучшее
5. Конечно. Я только что предложил небольшую оптимизацию для вашего решения. Я не говорил, что это плохо, и не сравнивал его с любым другим возможным решением