2013-06-11 1 views
0

나는이 Palindrome 프로그램에서 일해 왔고, 정말로 그것을 완료하는 것에 가깝다. 그것이 나에게 약간 미친 하하를 몰아 넣었다는 점에 유의한다. 프로그램은 각각의 '문구'를 검사하여 그것이 Palindrome인지 아닌지를 판별하고 실제로는 Palindrome 인 경우 공백과 구두점이 제거 된 소문자 버전을 반환합니다. 그렇지 않으면, 그렇지 않으면 None을 반환해야합니다. 필자는 테스트 데이터를 함수에 가져 오는 데 문제가 있습니다. 나는 그것을 다루는 올바른 방법을 생각하는 것처럼 보일 수 없다. 아마 꽤 간단 할거야 ... 어떤 아이디어? 감사합니다.Palindrome 프로그램의 작은 문제

import string 

def reverse(word): 
    newword = '' 
    letterflag = -1 
    for numoletter in word: 
     newword += word[letterflag] 
     letterflag -= 1 
    return newword 


def Palindromize(phrase): 
    for punct in string.punctuation: 
     phrase= phrase.replace(punct,'') 
     phrase = str(phrase.lower()) 

    firstindex = 0 
    secondindex = len(phrase) - 1 
    flag = 0 
    while firstindex != secondindex and firstindex < secondindex: 
     char1 = phrase[firstindex] 
     char2 = phrase[secondindex] 
     if char1 == char2: 
      flag += 1 
     else: 
      break 
     firstindex += 1 
     secondindex -= 1 
    if flag == len(phrase) // (2): 
     print phrase.strip() 
    else: 
     print None 

def Main(): 
    data = ['Murder for a jar of red rum',12321, 'nope', 'abcbA', 3443, 'what', 
    'Never odd or even', 'Rats live on no evil star'] 
    for word in data: 
     word == word.split() 
     Palindromize(word) 
if __name__ == '__main__': 
    Main() 
+0

'int'의'split' 메소드가 없습니다. 문자열로 변경해보십시오. – Jared

답변

1

이 줄이 문제의 원인 일 수 있습니다.

for word in data: 
    word == word.split() # This line. 
    Palindromize(word) 

당신은 오히려 word = word.split()를 사용하여 수행 할 수있는 변수 word를 재 할당보다, 여기 어떤지를 테스트하고 있습니다. word 다음 목록되고, 당신은 또한

for elem in word: 
    Palindromize(elem) 

사용하여 목록을 반복 할 수 있습니다, 당신은 할 수 없습니다 intsplit 메소드를 호출하는 것으로 보인다 문자열로 변환하려고합니다.

또한 for 루프에서 구문을 소문자로 변환하는 이유는 무엇입니까? 한 번만 수행하면 충분합니다. 내가 발견 차 오류

0

하나는 여기에 있습니다 :

for word in data: 
    word==word.split() 

여기, 두 실수 있습니다 : 1. 더블 여기 아무 소용도하지 않습니다 등호. 2. 각 반복 데이터의 내용을 분할하려는 경우 word이라는 중복 집합을 수정 중이므로 이와 같이하면 원본 목록이 변경되지 않습니다. 목록을 달성하기 위해, 않습니다

for i in range(data): 
     data[i]=data[i].split() 

이 프로그램의 "핵심"에서 당신의 오류

1

을 취소 할 수 있습니다, 당신은 예를 들어 filter을 사용하여 파이썬에서 훨씬 더 잘 할 수 있습니다. 여기에 빠른 데모입니다 : 당신이 바나나를 가기 전에

>>> phrase = 'Murder for a jar of red rum!' 

>>> normalized = filter(str.isalnum, phrase.lower()) 
>>> normalized 
'murderforajarofredrum' 

>>> reversed = normalized[-1::-1] 
>>> reversed 
'murderforajarofredrum' 

# Test is it is a palindrome 
>>> reversed == normalized 
True 
1

,의 문제를 다시 생각하자 :

  1. 당신은 이미 회문은 문장 부호, 공백, 또는 혼합 된 경우없이 문자열에 의미가 있다고 지적했다. 따라서 원치 않는 문자를 제거하거나 허용 된 문자를 선택하여 입력 문자열을 변환해야합니다. 후자의 경우, 상상할 수

오기 문자열

clean_data = CH위한 채널을 original_data의 경우 string.ascii_letters에서 CH]

clean_data 용 = '.join (clean_data) .낮은()

  1. 입력의 청소 버전을 갖는, 하나는 -1이다 특히, 문자열의 슬라이스에 세 번째 매개 변수를 고려해 볼 수 있습니다)

같은 비교를합니까
if clean_data[::-1] == clean_data: 
    .... 

벨을 울리시겠습니까?