2015-03-06 2 views
0

Я пытаюсь написать функцию Python, которая принимает две строки в качестве аргументов и возвращает, имеют ли они одинаковые гласные (количество не имеет значения).Сравнение строк Python - гласные

Поэтому ('действительно', 'bed') должно возвращать true, но ('действительно', 'irate') должно возвращать false.

я застрял с этим довольно пугающей попытка ...

def vocalizer(string_a,string_b): 
vowels = ['a', 'e', 'i', 'o', 'u'] 
result = '' 
result_2 = '' 
for character in string_a: 
    if character in vowels: 
     result = result + character 
     for item in string_b: 
      if item in vowels: 
       result_2 = result_2 + item 
       for vowel in result: 
        if vowel not in list(result_2): 
         return False 
        else: 
         if vowel in list(result_2): 
          return True 
+0

'Поэтому ('действительно', 'кровать') должно возвращать true, но ('действительно', 'irate') должно возвращать false. «Не могли бы вы объяснить, почему? –

+1

Я не понимаю, почему * ('действительно', 'bed') должен возвращать true *, потому что у первого есть гласные 'i' и' e' другие только 'e'? – halex

+0

Ничего себе, мой плохой. Исправление - поэтому («поступок», «кровать») должен возвращать True. –

ответ

4

Короткий и выразительный:

def keep_only_vowels(s): 
    vowels = ('a', 'e', 'i', 'o', 'u') 
    return (c for c in s.lower() if c in vowels) 

def vocalizer(s1, s2): 
    return set(keep_only_vowels(s1)) == set(keep_only_vowels(s2)) 
+2

Просто 'return set (c для c в s.lower(), если c в 'aeiou')' – georg

2

Я хотел бы использовать пересечение множеств для извлечения гласные из каждой строки. Как это:

all_vowels = set('aeiou') 

def vowel_set(s): 
    return all_vowels.intersection(s.lower()) 

def same_vowels(s1, s2): 
    return vowel_set(s1) == vowel_set(s2) 

print same_vowels('deed', 'bed') 
print same_vowels('indeed', 'irate') 
print same_vowels('DEAD', 'earnest') 
print same_vowels('blue', 'ICE') 

выход

True 
False 
True 
False 
+0

Спасибо, это отлично выглядит. Однако, поскольку мы все еще учимся, наш профессор хочет, чтобы мы как можно больше избегали встроенных функций, чтобы забивать основы. Вот почему моя попытка немного затянута, если не сказать больше. –

+0

@ newrecruit21: Ах. Вы должны упомянуть такую ​​информацию в этом вопросе. OTOH, на самом деле не больно иметь альтернативные ответы, поскольку точка Stack Exchange заключается в создании набора хороших вопросов и хороших ответов, а люди в будущем, которые наткнулись на этот вопрос через Google и т. Д., Могут не иметь те же ограничения, что и вы. –

1

Ваш собственный код может быть улучшен очень легко, потому что ваша общая стратегия была правильной:

def vocalizer(string_a,string_b): 
    vowels = ['a', 'e', 'i', 'o', 'u'] 
    result = '' 
    result_2 = '' 
    for character in string_a: 
     if character in vowels: 
      result += character 
    for item in string_b: 
     if item in vowels: 
      result_2 += item 

    result = set(list(result)) 
    result_2 = set(list(result_2)) 
    #print("result= {}".format(result)) 
    #print("result_2= {}".format(result_2)) 
    if result == result_2: 
     return True 
    else: 
     return False 

Когда вы удаляете слова их согласных, вы можете просто создать список из строк, а затем удалить повторяющиеся элементы, переведя их в группы. Наконец, вы можете сравнить наборы, чтобы убедиться, что они равны. Например:

>>> vocalizer ('indeed','irate') 
result= {'i', 'e'} 
result_2= {'i', 'e', 'a'} 
False 
>>> vocalizer ('indeed','ie') 
result= {'i', 'e'} 
result_2= {'i', 'e'} 
True 
>>> 
+2

Это именно то, что я искал. Спасибо. –

0

Через модуль.

>>> def checkvow(x, y): 
     return set(i.lower() for i in re.findall(r'(?i)[aeiou]', x)) == set(i.lower() for i in re.findall(r'(?i)[aeiou]', y)) 

>>> print(checkvow('deed', 'bed')) 
True 
>>> print(checkvow('indeed', 'irate')) 
False 
>>> print(checkvow('DEAD', 'earnest')) 
True 
>>> print(checkvow('blue', 'ICE')) 
False 
Смежные вопросы