2013-07-18 4 views
1

Учитывая строку, мне нужно найти индекс всех палиндромов определенной длины внутри этой последовательности, а затем напечатать этот индекс рядом с длиной палиндрома.Необходимо найти все палиндромы определенной длины

Например, если я хотел палиндромов, которые 4 символов:

seq = 'abbacdefggfhijkkjlmn' 

оптимальное считывание будет:

[(0,4), (7,4), (13,4)] 

Я написал функцию, которая делает это, однако у меня есть глюк в нем. Он возвращает правильный набор данных, но он возвращает его снова и снова, столько раз, сколько длина последовательности. Например, учитывая последовательность выше, вернуться бы набор данных в 20 раз:

def find_palindromes(seq,y): 
L = len(seq) 
res = [] 
for x in seq: 
    x=0 
    while x<= L-y: 
     if seq[x:x+y] == reverse(seq[x:x+y]): 
      res.append((x,y)) 
     x=x+1 
return res 

Любое понимание, как на мой глюк будет очень ценна. Я знаю, что это не самый эффективный способ делать что-то, но я невероятно новенький и просто пытаюсь промокнуть.

+0

Пожалуйста исправить отступы в коде – Frodon

+0

Вы зацикливание с 'for' цикла по' x', затем повторно назначая ' x' и выполнить цикл while. Вероятно, вы получите то, что хотите, если вы удалите строку 'for x in seq', а затем исправьте отступ. – 2rs2ts

ответ

1

Ваш цикл for начинается с 0 каждый раз, поэтому вы делаете это эффективно столько раз, сколько символов в seq. Цикл while должен быть достаточно сам по себе - все, что вам нужно сделать, - это повторить последовательность один раз. Поэтому (как говорится в комментарии 2rs2ts) просто удалите строку for x in seq.

Это действительно простое исправление: немного более резкое - это включить цикл while в цикл for x in range(0, L-y):.

Также: все в коде, который не является заголовком функции, должен быть отступом, поэтому Python знает, что он находится внутри функции.

+0

Спасибо за помощь. Я очень ценю это. Это имеет большой смысл, и проблема сразу устранена. –

0

Вот выражение 1 линия, которая должна соответствовать вашим потребностям:

def find_palindromes(seq,y): 
    return [(seq.index(seq[x:x+y]),y) for x in range(len(seq)-y) if seq[x:x+y] == seq[x:x+y][::-1]] 
Смежные вопросы