Ну. fdj
будет соответствовать, потому что это первые 3 символа строки? Или это происходит откуда-то еще? Если у вас более 2 вхождений вашего needle
, вам нужно расстояние между первыми 2-мя матчами, или первым, и последним, или все расстояния для каждой пары матчей?
Ну, я могу дать вам функцию, которая даст вам все матчи.
>>> def find_matches(needle, hackstay):
... '''returns a list of positions of needle in hackstay'''
... ptr = 0
... found = []
... while True:
... idx = hackstay[ptr:].find(needle)
... if idx < 0: return found
... found.append(ptr+idx)
... ptr += idx+len(needle)
...
>>>
>>>
>>> find_matches('fdj','fdjhkajajkfdj')
[0, 10]
Расстояние между двумя элементами массива - это только больший элемент минус меньший элемент минус длина иглы.
Пример:
>>> res = find_matches('fdj','fdjhkajajkfdj')
>>> distance = abs(res[0]-res[1])-len('fdj')
>>> print distance
7
С этим вы можете решить сами, где needle
приходит и какие расстояния вам нужно. Надеюсь, поможет!
PS: Если кто-нибудь может предложить, как улучшить этот код, пожалуйста, сделайте это! Мое чувство говорит, что это можно записать короче (например, используя found = [i for ??? if ???]
), но я не знаю, как.
Я думаю, что ваш подход может быть менее эффективным, чем просто пересечение строки и поиск. Есть ли причина, по которой вам нужно хранить эти слова с тремя буквами? – JoshD
ответит аааа на [0] и [1]? Решение меняется, если нет совпадений. Каков точный результат для 'aaa', найденный в [3], [20] и [33]? –
@JoshD: Мне не нужно хранить буквы, но должны быть найдены только дубликаты. @ Тони: Я хочу расстояние между двумя последовательностями. Таким образом, ожидаемый результат равен aaa, найденному на отметке 3, 20 и 33. – rda3mon