Как перебрать несколько элементов, используя split (), и проверить наличие гласных, используя циклы for? - PullRequest
0 голосов
/ 10 октября 2019

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

Напишите функцию 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» в элементе first в 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.")

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Взгляните на 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)
1 голос
/ 10 октября 2019

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

Сначала вы разделили помехи: 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...