У меня следующая домашняя задача:

Напишите функцию countVowels (), которая принимает строку в качестве параметра и печатает количество появлений гласных в строке.

>>> countVowels('It was the best of times; it was the worst of times.')
a, e, i, o, and u appear, respectively, 2, 5, 4, 3, 0 times.
>>> countVowels('All for one, and one for all!')
a, e, i, o, and u appear, respectively, 3, 2, 0, 4, 0 times.
>>>

Я создал функцию, которая намеревается взять строку, подобную str1 = "bananas are tasty", разделить строку и присвоить ее переменной, чтобы она стала str1_array = ['bananas', 'are', 'tasty'], а затем с помощью циклов for перебирать str1_array, подсчитайте гласные a, e, i, o и u соответственно и включите количество каждой гласной в конечный оператор print().

Я столкнулся с проблемой, когда функция будет считать только "a" в первом элементе в str1_array, и будет повторять эту сумму в моем конечном операторе печати. ​​

Т.е. для str1_array = ['bananas', 'are', 'tasty'] я получаю инструкцию для печати A, E, I, O, and U appear, respectively, 3 3 3 3 and 3 times.

def countVowels(str1):
    str1_array = str1.split(" ")
    vA = ["A", "a"]
    vE = ["E", "e"]
    vI = ["I", "i"]
    vO = ["O", "o"]
    vU = ["U", "u"]

    vA_count = 0
    for vA in str1_array:
        vA_count = vA_count + 1
    vE_count = 0
    for vE in str1_array:
        vE_count = vE_count + 1
    vI_count = 0
    for vI in str1_array:
        vI_count = vI_count + 1    
    vO_count = 0
    for vO in str1_array:
        vO_count = vO_count + 1    
    vU_count = 0
    for vU in str1_array:
        vU_count = vU_count + 1

    print("A, E, I, O, and U  appear, respectively, ", vA_count, vE_count, vI_count, vO_count, "and", vU_count, "times.")
0
Pallu08 10 Окт 2019 в 10:41
Вы выполняете итерацию только по элементам в массиве гласных (например, vA) - вам также необходимо перебирать каждое слово в str1_array
 – 
rst-2cv
10 Окт 2019 в 10:49
Он не перебирает массив гласных. Он их затирает словами.
 – 
Mathieu
10 Окт 2019 в 11:01

2 ответа

Взгляните на str.count(). Вы можете просто сделать:

def countVowels(s):
    vowels = ['a', 'e', 'i', 'o', 'u']

    # Save the string in lower case to also match upper case instances
    lower_s = s.lower()

    # Possible improvement: generate this message from vowels list
    msg = 'a, e, i, o, and u appear, respectively'

    for v in vowels:
        msg += ', ' + str(lower_s.count(v))

    msg += ' times.'

    print(msg)

Это решение, по общему признанию, не очень хорошее, поскольку оно выполняет итерацию по всей строке один раз для каждой гласной. Вы могли бы улучшить его, перебирая строку только один раз и подсчитывая, сколько раз появляется любой символ (не только гласные). Затем вы можете просто распечатать интересующие вас значения:

from collections import defaultdict

def countVowels(s):
    vowels = ['a', 'e', 'i', 'o', 'u']
    lower_s = s.lower()

    # Create a dictionary of int values to store the number of appearances of a
    # letter
    results = defaultdict(int)

    for c in lower_s:
        results[c] += 1

    msg = 'a, e, i, o, and u appear, respectively'

    for v in vowels:
        msg += ', ' + str(results[v])
    msg += ' times.'

    print(msg)
2
user2891462 10 Окт 2019 в 11:03

Давайте сначала определим проблемы в вашем коде:

Сначала вы разделяете перемешивание: str1_array = ['bananas', 'are', 'tasty']. Затем вы определяете свои гласные как, например, vA = ["A", "a"]. И затем вы выполняете цикл для подсчета:

vA_count = 0
for vA in str1_array:
    vA_count = vA_count + 1

На самом деле последняя часть этого не делает. Если вы это сделаете

for vA in str1_array:
    print (vA)

Ты получишь:

'bananas'
'are'
'tasty'

Что происходит, когда переменная vA, ранее определенная как ["A", "a"], перезаписывается и определяется последовательно как 3 слова в str1_array.

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

from collections import Counter
c = Counter("bananas are tasy".lower())

Это приведет к понижению строки, то есть буквы верхнего регистра превращаются в буквы нижнего регистра; а затем он создаст объект счетчика. Затем вы можете получить доступ к количеству гласных как:

IN: c['a']
OUT: 5

И таким образом с петлей:

vowels = ['a', 'e', 'i', 'o', 'u']
for v in vowels:
    print c[v]
1
Mathieu 10 Окт 2019 в 10:59
По совпадению, «3» было напечатано потому, что я печатал три слова, а не потому, что первое слово содержало три символа «а». Это поднимает проблему, о существовании которой я даже не подозревал. Спасибо за более исчерпывающий ответ. Я внесу некоторые изменения.
 – 
Pallu08
10 Окт 2019 в 11:04
Точно, на каждом счетчике «гласных» вы повторяли 3 раза по 3 словам, каждый раз добавляя по одному к счетчику. Таким образом, у вас есть по 3 на каждую фишку.
 – 
Mathieu
10 Окт 2019 в 11:14