последующая проверка гласных, нуждающаяся в помощи

#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. Конечно. Я только что предложил небольшую оптимизацию для вашего решения. Я не говорил, что это плохо, и не сравнивал его с любым другим возможным решением