2014-02-17 2 views
-1

Мне нужно проверить, присутствует ли гласный в слове. если это так, операция должна выполняться над словом say op (word). я хочу, чтобы избежать для цикла, потому что я думал об этом:Проверить наличие гласных в слове, python

for char in word: 
    if char in 'aeiou': 
#confused here... 

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

+0

'любой (i.lower() в 'aeiuo' для г в слове)' –

+0

этот тип вопроса было много раз спрашивали, –

+0

я искал, вмятина получить любой .. –

ответ

4
vowels = {"a", "e", "i", "o", "u", "A", "E", "I", "O", "U"} 
if any(char in vowels for char in word): 
    ... 

Примечание: Это лучше, потому что короткие замыкания, как только он находит гласные в слове. Таким образом, он не должен проверять все символы, если в строке нет гласных.

Edit: Ран timeit test и обнаружил, что, @falsetru's answer очень быстро, но с некоторыми оптимизациями, версия re бьет все остальное.

import re 

vowels = {"a", "e", "i", "o", "u", "A", "E", "I", "O", "U"} 
pattern = re.compile("[AEIOUaeiou]") 

def intersection(): 
    return bool(vowels.intersection("TWYNDYLLYNGS")) 

def any_version(): 
    return any(char in vowels for char in "TWYNDYLLYNGS") 

def re_version(): 
    return bool(pattern.search("TWYNDYLLYNGS")) 

def disjoint(): 
    return vowels.isdisjoint("TWYNDYLLYNGS") 

from timeit import timeit 

print timeit("intersection()", "from __main__ import intersection, vowels") 
print timeit("any_version()", "from __main__ import any_version, vowels") 
print timeit("re_version()", "from __main__ import re_version, vowels") 
print timeit("disjoint()", "from __main__ import disjoint, vowels") 
+0

Хорошо, закрытие. Давайте очистим комментарии – slezica

4

Вы можете избежать петли for используя set intersection

if set('aeiou').intersection(word.lower()): 
+0

Это не удастся на '' ENERGY'' –

+1

спасибо вам. отредактировано с помощью 'lower()' – mhlester

3

Использование set.isdisjoint (Этот метод возвращает как только он нашел матч):

>>> vowels = set('aeiou') # set('aeiouAEIOU') if you want case-insensitivty 
>>> not vowels.isdisjoint('bcd') 
False 
>>> not vowels.isdisjoint('hello') 
True 
+0

'not vowels.isdisjoint ('WORD')' –

+0

@BurhanKhalid. Может быть, вы видите старую версию ответа. См. Комментарий в ответе. – falsetru

+0

или вы можете сделать 'not vowels.isdisjoint (word.lower())' –

0

Вы можете использовать регулярное выражение.

import re 

if re.search('[AEIOU]', word, flags=re.I): 
    # contains vowels 
else: 
    # does not 
+2

или' re.search ('[aeiou]', word, flags = re.I) ' – falsetru

+0

yes; так лучше. редактирование –

0
def vowelz(a): 
     vowels = ["a", "e", "i", "o", "u"] 
     vowel = False 
     for vowell in vowels: 
       if vowell in a: 
         vowel = True 
     print vowel 
vowelz(raw_input("Enter a word:")) 
+0

Добро пожаловать в переполнение стека! Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, почему и/или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. Кодовые ответы не приветствуются. – Ajean

Смежные вопросы