Используя свой собственный код, вам нужно фильтровать символы не гласные, вы можете опустить каждый символ и сделать гласными набор для O (1) операций поиска:
def numVowels(s):
vowels = {"a","e","i","o","u"}
if s == '':
return 0
else:
totalVowels = list(filter(lambda x: x.lower() in vowels , s))
return len(totalVowels)
который может просто стать:
def numVowels(s):
vowels = {"a","e","i","o","u"}
return len(list(filter(lambda x: x.lower() in vowels , s)))
каждый x
в лямбда является каждый символ из s
, проходя lambda x: x.lower() in vowels
фильтровать будет фильтровать любой символ из s
, что не в наших гласных звуков, установленных таким образом, мы остались со списком просто не-vowles.
Вы можете комбинировать sum
с filter
и lambda
:
def numVowels(s):
vowels= {"a","e","i","o","u"}
return sum(1 for _ in filter(lambda x: x.lower() in vowels , s))
или вообще когда лямбда не был nesessity, просто вернув выражение генератора будет лучшим подходом:
def numVowels(s):
vowels= {"a","e","i","o","u"}
return sum(x.lower() in vowels for x in s))
последняя часть ответа наиболее эффективна для больших входных данных, так как для наборов есть O(1)
. x.lower() in vowels
будет либо True/False
1
, либо 0
, поэтому вам просто нужно суммировать их все. Если s
пустая строка или нет гласные sum
возвратит 0
пример того, как x.lower() in vowels
работ:
In [8]: tests = "String with vowels"
In [9]: l = [x.lower() in vowels for x in tests]
In [10]: l
Out[10]: # list of booleans
[False,
False,
False,
True,
False,
False,
False,
False,
True,
False,
False,
False,
False,
True,
False,
True,
False,
False]
In [11]: l = [int(b) for b in l]
In [12]: l # list of 1's and 0's equating to True and False
Out[12]: [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0]
проверить, какие «лямбда-гласные»: сумма («AEIOUaeiou») 'делает – acushner
ваш код действительно ничего не делает из того, что я могу сказать –
Застрял как? Вы пытаетесь 'sum()' гласные, что не имеет смысла. – AChampion