2014-11-08 2 views
1

Я пытаюсь написать программу, которая найдет в одном слове все palindromes. Например, слово «радар» имеет 2 палиндрома radar и ada. Мы пропускаем отдельные буквы, поэтому r, a, d и т. Д. Не являются палиндромами.Непонятное назначение списка

import copy 

def ILEP(word): 
    lista = list(word) 
    counter = 0 
    pali = [] 
    def isPalindrome(listaWord): 
     backup = copy.deepcopy(listaWord) 
     backup.reverse() 
     a = ''.join(backup) 
     b = ''.join(listaWord) 
     if(a == b): 
      return True 
     else: 
      return False 

    for i in range(len(lista)): 
     current = [lista[i]] 
     for j in range(i+1, len(lista)): 
      current.append(lista[j]) 
      if(isPalindrome(current)): 
       print(current) 
       pali.append(current) 
       counter+=1 
    print(pali) 
    return counter 
print(ILEP("radar")) 

Программа находит все палиндромов правильно, но assings их неправильно в список pali. Консоль:

['r', 'a', 'd', 'a', 'r'] 
['a', 'd', 'a'] 
[['r', 'a', 'd', 'a', 'r'], ['a', 'd', 'a', 'r']] 
2 

Как вы можете видеть, что печатает палиндромов ['r', 'a', 'd', 'a', 'r'] и ['a', 'd', 'a'], но список pali получил неверное значение [['r', 'a', 'd', 'a', 'r'], ['a', 'd', 'a', 'r']]

ответ

3

Вы изменяете свой список current после добавления к pali. Вам необходимо сделать копию:

def is_palindrome(word): 
    return word[::-1] == word 

def ILEP(word): 
    pali = [] 
    for i, ch in enumerate(word): 
     current = [ch] 
     for ch in word[i+1:]: 
      current.append(ch) 
      if is_palindrome(current): 
       print(current) 
       pali.append(current[:]) 
    print(pali) 
    return len(pali) 

print(ILEP("radar")) 
+0

можно объяснить мне функцию 'is_palindrome'? – RouNdeL

+0

'word [:: - 1]' дает копию слова в обратном порядке. – Daniel

+0

hahaha, U немного сократил мою функцию – RouNdeL

Смежные вопросы