2013-05-12 2 views
0

저는 프로그램을 작성하려고하는데, 제가해야할 일 중 하나는 숫자가 회문인지 확인하는 것입니다. 어떤 이유 는, 내가 쓴 작동하지 않습니다Python : palindrome을 확인하면 False가 반환됩니다.

flag = True 
for j in range(0, len(listnum)): 
    for t in range(len(listnum) -1, -1, -1): 
     if listnum[j] == listnum[t]: 
      flag = True 
      print "false" 
     else: 
      flag = False 
      print "false" 
      break 
if flag == True: 
    return True 
else: 
    return False 

인쇄 "거짓"/ "진정한"부분은 디버깅을위한 것입니다. 필자가 작성한 함수에서이 코드를 제거 했으므로 "return True/False"가 표시됩니다. 마지막 번호가 목록에있는 다른 다른 경우

내가 확인하고있어 수는 906,609

+0

왜'flag' 변수를 제거하지 않고 내부 루프에서 직접'True' /'False'를 반환하지 않을까요? – Alexey

+0

그 일을하곤 했었지만, 무엇이 false를 반환하는지 살펴 보려고했는데, 이것이 내가 이것을 포함하여 몇 가지를 변경 한 이유입니다. – user2240288

+0

흠, 내가 그것을 바꿨을 웬일인지, 그것은 효과가 있었다. – user2240288

답변

1

귀하의 기능을 검사합니다. 당신이 원하는 것은 아마도 :

def palindrome(listnum): 
    for j in range(0, len(listnum)): 
     t = len(listnum) - j - 1 
     if listnum[j] != listnum[t]: 
      return False    

    return True 

assert palindrome([9,0,6,6,0,9]) 
assert palindrome("ABBA") 
assert palindrome([]) 
assert palindrome("1") 
assert palindrome([1.0, 2, 1]) 
assert not palindrome("lolz") 
assert not palindrome([1,2,3]) 
+0

그래, 모든 것이 올바르게 반환됩니다. 고마워요. – user2240288

2

그것은 당신의 코드가 작동하지 않는 이유에 대한 답변 아니지만, 당신은 단어가 회문 여부를 확인하는 훨씬 쉬운 방법이 있다고 알고 관심이있을 수도 있습니다. 정의에 따르면, 회문은 그것을 뒤집어서 변하지 않는 단어입니다. 따라서 :

def is_palindrome(word): 
    return word == ''.join(reversed(word)) 

print is_palindrome('906609') # True 

설명이 필요할 수도있는 부분은 join입니다. reversed이 단어의 문자를 하나씩 반환하기 때문에 필요합니다. 먼저 단어를 다시 묶어야합니다.

의견에서 지적한 바와 같이, 또 다른 작성 방법은 word == word[::-1]입니다. 그것은 똑같은 것을 의미하지만 틀림없이 조금 더 수수한 것입니다.

+2

음,'word == word [:: - 1]'은 "더 쉬울 것"입니다. – georg

+0

사실,하지만'' '.join (역행 (단어))'은 단순히'word [:: - 1]'입니다. –

+0

word [:: - 1] 또한 4.3 배 빠릅니다 (적어도 내 Windows 7 PC에서는 32 -bit Python 3.3.1) – Alexey

2

여기서 중요한 문제는 for 루프의 중첩입니다. 잠금 단계에서 j와 t를 업데이트하려고하지만 j = 0으로 시작한 다음 t의 모든 값을 확인하면됩니다. 그러면 j = 1이고 t의 모든 값을 다시 확인하십시오.

중첩 루프 대신 루프 카운터를 사용하여 단어를 조사하는 거리를 추적 한 다음 그 중 j 및 t를 계산할 수 있습니다 . 예 :

for d in range(len(listnum)/2): 
    j = d 
    t = len(listnum) - d - 1 
    #letter equality check here, return if false 

return True 
+0

문제를 설명해 주셔서 감사합니다. 그러나 프로펠러의 코드는 어떻게 작동했는지 이해할 수 없었습니다. – user2240288

+0

@ user2240288 루프가 중첩되어 있기 때문에 문자를 서로 비교하고있었습니다. 따라서 외부 루프를 반복 할 때마다'listnum [j]'와 다른 문자를 찾자 마자 내부 플래그가'flag = False'로 중단됩니다. 따라서 함수가 문자열에 동일한 문자 (예 :'777777 ') 만 들어 있는지 실제로 확인하고있었습니다. – Alexey

+0

@ user2240288 프로그램의 일부를 수행하고 모든 단계를 수동으로 (종이 또는 텍스트 편집기에서) 수행하면 코드가 작동하는 방식과 변경해야 할 부분을 이해하는 데 도움이됩니다. – Alexey

관련 문제