Не могу заставить мою функцию подсчета работать в Python - PullRequest
2 голосов
/ 06 января 2012

Я пытаюсь создать функцию, в которую можно вставить фразу типа «ана» в слове «банан» и подсчитать, сколько раз она находит фразу в слове.Я не могу найти ошибку, которую я делаю для некоторых из моих тестовых модулей не работать.

def test(actual, expected):
    """ Compare the actual to the expected value,
        and print a suitable message.
    """
    import sys
    linenum = sys._getframe(1).f_lineno   # get the caller's line number.
    if (expected == actual):
        msg = "Test on line {0} passed.".format(linenum)
    else:
        msg = ("Test on line {0} failed. Expected '{1}', but got '{2}'.".format(linenum, expected, actual))
    print(msg)

def count(phrase, word):
    count1 = 0
    num_phrase = len(phrase)   
    num_letters = len(word)    

    for i in range(num_letters):
        for x in word[i:i+num_phrase]:
             if phrase in word:
                 count1 += 1
             else:
                 continue    
        return count1

def test_suite():
    test(count('is', 'Mississippi'), 2)
    test(count('an', 'banana'), 2)
    test(count('ana', 'banana'), 2)
    test(count('nana', 'banana'), 1)
    test(count('nanan', 'banana'), 0)
    test(count('aaa', 'aaaaaa'), 4)

test_suite()

Ответы [ 6 ]

5 голосов
/ 06 января 2012

Изменение вашей функции count на следующие испытания проходит успешно:

def count(phrase, word):
    count1 = 0
    num_phrase = len(phrase)   
    num_letters = len(word)    
    for i in range(num_letters):
        if word[i:i+num_phrase] == phrase:
          count1 += 1
    return count1
4 голосов
/ 06 января 2012

Используйте str.count(substring).Это вернет, сколько раз подстрока встречается в полной строке (str).

Вот интерактивный сеанс, показывающий, как это работает:

>>> 'Mississippi'.count('is')
2
>>> 'banana'.count('an')
2
>>> 'banana'.count('ana')
1
>>> 'banana'.count('nana')
1
>>> 'banana'.count('nanan')
0
>>> 'aaaaaa'.count('aaa')
2
>>> 

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

0 голосов
/ 02 декабря 2015

Другой способ:

def count (последовательность, элемент):

  count = 0

  for x in sequence :

     if x == item :
     count = count+1
  return count   
0 голосов
/ 06 января 2012

На этот раз основной вопрос.

когда вы видите строку типа "isisisisisi" сколько "isi" вы считаете?

в первом состоянии вы видите строку "isi s isi s isi" и возвращаете 3 в качестве счетчика.

во втором состоянии вы видите строку "isisisisisi" и подсчитывает время буксировки "i" для каждой фразы, как это "isi isi isi isi isi". Другими словами, второе «i» является последним символом первого «isi» и первым символом второго «isi».

так что вы должны вернуть 5 как количество.

для первого состояния просто можно использовать:

>>> string = "isisisisisi"
>>> string.count("isi")
3

и для второго состояния вы должны распознать "phrase"+"anything"+"phrase" в поисковом слове.

нижеследующая функция может сделать это:

def find_iterate(Str):
     i = 1
     cnt = 0
     while Str[i-1] == Str[-i] and i < len(Str)/2:
         i += 1
         cnt += 1
     return Str[0:cnt+1]

Теперь у вас есть много вариантов подсчета поискового ключевого слова в строке.

например я делаю так ниже:

if __name__ == "__main__":
    search_keyword = "isi"
    String = "isisisisisi"
    itterated_part = find_iterate(search_keyword)
    c = 0
    while search_keyword in String:
        c += String.count(search_keyword)
        String = String.replace(search_keyword, itterated_part)
    print c

Я не знаю, есть ли лучший способ в python.но я пытался сделать это с помощью регулярных выражений, но не нашел пути.

0 голосов
/ 06 января 2012

Полагаю, str.count (подстрока) является неправильным решением, поскольку не учитывает перекрывающиеся подстроки, а набор тестов завершается неудачей.

Существует также встроенный метод str.find , который может быть полезен для этой задачи.

0 голосов
/ 06 января 2012

Вы используете итерацию неправильно, поэтому:

for i in range(num_letters):   #This will go from 1, 2, ---> len(word)    

    for x in word[i:i+num_phrase]:  
    #This will give you the letters starting from word[i] to [i_num_phrase] 
    #but one by one, so :  for i in 'dada': will give you 'd' 'a' 'd' 'a'

         if phrase in word:       #This condition doesnt make sense in your problem, 
                                  #if it's true it will hold true trough all the 
                                  #iteration and count will be 
                                  #len(word) * num_phrase,                 
                                  #and if it's false it will return 0
             count1 += 1
         else:
             continue   
...