Проблема с пользовательской функцией определения в Python - PullRequest
0 голосов
/ 19 августа 2011

Хорошо, вот моя проблема, я определил функцию, которая должна подсчитывать, сколько раз определенный фрагмент встречается в строке. Функция начинает поиск с индекса [0], а последующий поиск начинается с индекса последнего совпадения в строке.

ЗДЕСЬ КОД

def function(fragment, string):
    count = -1
    last_match = 0
    while last_match != -1:
        count += 1
        last_match = string.find(fragment, last_match)
    return count

Теперь вот проблема: когда я передаю параметры в функцию с фрагментом, который явно совпадает в строке, я получаю бесконечный цикл. Когда я исправляю бесконечный цикл, если фрагмент прохода, который находится в Index [0], функция не возвращает правильный счет ???

например:
function('gtg' , 'gttacgtggatg' ) This gives me an infinite loop

function('gtt' , 'gttacgtggatg' ) This doesn't return a count..

Просто ищу помощь и ввод ..

Спасибо

Ответы [ 4 ]

4 голосов
/ 19 августа 2011

Вы должны использовать существующие функции, если это возможно:

"aabbccaabb".count("aa")

Метод count делает именно то, что вы хотите.Приведенный выше пример возвращает 2.

1 голос
/ 19 августа 2011

У вас есть две ошибки:

  1. Строковая документация гласит, что поиск вернет -1 , если фрагмент не найден
  2. Last_match возвращает индексначало совпадения и поэтому, если вы будете искать снова по этому индексу, вы снова и снова будете находить одно и то же совпадение.

Так что вам, вероятно, придется использовать это:

def function(fragment, string):
    count = -1
    last_match = 0
    while last_match != -1:
        count += 1
        last_match = string.find(fragment, last_match)
        if last_match != -1:
            last_match += 1
    return count

>>> function('gtt' , 'gttacgtggatg' )
1
>>> function('gtg' , 'gttacgtggatg' )
1

Конечно, вы также можете полагаться на string.count (фрагмент), если вас не интересуют перекрывающиеся совпадения ... или регулярные выражения, упомянутые в предыдущих ответах ...

>>> 'gttacgtggatg'.count('ctt')
0
>>> 'gttacgtggatg'.count('gtt')
1
0 голосов
/ 19 августа 2011

Логически, ваша проблема в том, что вы просто находите одно и то же совпадение снова и снова:

last_match = string.find(fragment, last_match)

... начнется с того места, где вы нашли последнее совпадение, что просто даст вамту же позицию назад!Вам нужно использовать string.find(fragment, last_match + 1), что потребует от вас прыгать через обручи, чтобы использовать часовой для вашего начального значения last_match.

ответ Ахима ответ точен: вы должныиспользовать существующие функции для этого.

0 голосов
/ 19 августа 2011

Рассматривали ли вы использование регулярных выражений? Это хорошо адаптировано к вашему использованию. Модуль Python re

Обновление: чтобы расширить это, если вы делаете что-то вроде этого ...

импорт ре

...

def countOccurrence (myFragment, myString): expr = re.compile (myFragment) return len (expr.findall (myString))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...