Вернуть количество раз, когда строка "hi" появляется в любом месте данной строки - Python codingbat problem - PullRequest
0 голосов
/ 03 мая 2020

Я знаю, что могу использовать для этого функцию .count (), но я пытался сделать это с помощью for для l oop, и я продолжаю получать ошибку компиляции в строке 6. Кто-нибудь видит, что не так с этот код и почему он не даст такой же вывод? Заранее спасибо!

def count_hi(string):
# Create an empty list to add to
  num_hi = []
  # for every index in string , if the character is h and the next is i, 
  # add element to list
  for index in string:
    if string[index] == 'h' AND string[index + 1] == 'i':
      num_hi.append('hi found')
  return len(num_hi) # return length of list

Ответы [ 3 ]

2 голосов
/ 03 мая 2020

Почему бы не использовать count ?

def count_hi(string):
    return string.count('hi')

Исправление для вашего кода:

def count_hi(string):
    count = 0
    for i in range(1, len(string)):
        if string[i - 1] == 'h' and string[i] == 'i':
            count += 1
    return count
  1. Python чувствительно к регистру, а не AND, но and.
  2. Добавление к списку и подсчет его большого количества накладных расходов, вы должны просто использовать переменную и увеличивать ее каждый раз, когда найдете hi.
  3. Вместо перечисления вы можете использовать range, чтобы начать с индекса 1 и проверить вашу строку с i - 1 и 1. Позволяет избежать другой проверки.
  4. Я бы предпочел предыдущее решение с использованием .count(). Зачем писать код, если для вас есть встроенный метод?
1 голос
/ 03 мая 2020

См. Asnwer Харшала Пареха , он обеспечивает лучший анализ и объяснение.

Когда вы перебираете строку, вы перебираете не индексы, а над самими буквами. Быстрое решение для этого может быть:

def count_hi(string):
  num_hi = []
  # for every index in string , if the character is h and the next is i, add element to list
  for index, _character in enumerate(string):
    if index == len(string) - 1:
      break  # on the last one, you'd get an index error.
    if string[index] == 'h' and string[index + 1] == 'i':  # "and", not "AND"
      num_hi.append('hi found')
  return len(num_hi) # return length of list
0 голосов
/ 04 мая 2020

Самый простой способ сделать это - использовать встроенный модуль сбора.

from collections import Counter

def count_hi(string):
    counts = Counter(string.split())
    return print(counts['hi'])
...