2012-12-20 2 views
5

현재 palindrome-detector (anna, lol, hahah 등)에서 작업 중이며 for-loops를 사용하도록 요청 받았습니다.파이썬 3.0 용 For-loops

나는 두 개의 문자열 (값을 비교하면서 동시에 정기적으로 뒤로 읽을)을 통해 루프 프로그램을 원한다. 값이 같으면 palindrome은 True입니다. 그렇지 않다면 거짓입니다.

내 질문은 : 두 개의 for-loops를 동시에 실행하고 문자열 값을 비교하는 방법은 무엇입니까? 필요한 경우 전체 코드를 게시, (파이썬 3.0) 수 :

현재이 같은 일을

palindrom = True 
text2 = ("") 
for i in nytext: 
    for i in nytext[::-1]: 
     text2 = (nytext[::-1] + i) 
     if text2 == nytext: 
      palindrom = True 
     else: 
      palindrom = False 
return palindrom 

여러분의 도움에 감사드립니다!

편집 : 문제를 설명 할 때 충분히 명확하지 않을 수 있습니다. 이 프로그램은 다음을 수행합니다 : 사용자가 문자열 (예 : hello my name is lol)을 입력 할 수있게하고 프로그램이 이것이 회문인지 확인하도록 설계되었습니다. 세 가지 기능 (및 주요 기능)으로 나뉩니다.

기능 번호 1 수정은 (쉽게 읽을 그래서 LOL ,,,,,, LOL된다)에만 문자와 숫자로 감소되도록 텍스트. 기능 번호 2 테스트 디자인 ((- 루프를 이용!)) 입력이 있으면 회문. 함수 번호 3은 단순히 회문인지 아닌지 여부를 게시합니다.

나는에 대한-루프이 사용하기이 나는 단순히 같은 비교를 수행 할 수 없습니다 backwardtext = text.reverse() 경우 backwardtext == 텍스트 : 인쇄 ("그것은 회문이다")

나는이 일을 지 웁니다 바랍니다.

답변

8

당신은 어쩌면 약간 낮은 수준의 접근 방식은 (제공 항목은 인덱서입니다) 인덱스를 반복 할 것

s = 'hannah' 

for c_forward,c_backward in zip(s,s[::-1]): 
    ... 

zip를 사용 : 미래 방문자를위한

for i in range(len(s)): 
    c_forward = s[i]  #character as you loop going forward 
    c_backward = s[-(i+1)] #character as you loop going backward 
    pass #TODO: determine if palindome ... :-p 

,이 문제의 모든 제약 사항을 다루지는 않지만, 문자열이 파이썬에서 회문문인지 확인하는 가장 쉬운 방법은 단순히 다음을 수행하는 것입니다.

def ispal(s): 
    return s == s[::-1] 
+0

전부. – Will

+0

@Will - 가장 쉬운 방법은's == s [:: - 1]'입니다. 분명히 가장 파이썬 스럽습니다. 그러나 루프는 문제에 대한 제약 조건의 일부로 언급됩니다. OP가 'zip'이하는 일과 작동 방식을 이해하는 것이 중요합니다. 아마도 그것은 과제가 받고있는 부분 일 것입니다. 'map'과'all'을 던지면 그걸 도울 수 없습니다. :) – mgilson

+0

이것은 루핑 구문에 대한 지식을 얻는 것을 목표로하는 프로그래밍 작업입니다. 나는지도/감추기 스타일 프로그래밍을 사용하여 명시 적 루프를 모두 제거 할 수있는 경우가 있음을 지적하고자했습니다. – Will

3

zip()을 사용할 수 있습니다. 최단의 끝에서 정지 평행 개의 반복 가능 객체 위에

def is_palindrome(string): 
    return all(x == y for x, y in zip(string, reversed(string))) 

zip() 반복 기능 :

>>> list(zip("abc", range(10))) 
[('a', 0), ('b', 1), ('c', 2)] 
+0

string은 모듈 안에 빌드의 실제적인 이름입니다. –

+1

@ralu : 그러나 파이썬은 렉시 컬 스코핑을 사용하기 때문에 모듈 이름과 충돌하는 로컬 변수를 사용하는 것이 좋습니다. –

0
def is_palindrome(txt): 
    for i, a in enumerate(txt): 
     if a!=txt[-(i+1)]: 
      return False 
    return True 

txt = 'hannah' 
print txt, is_palindrome(txt) 
0

다만 거꾸로 자체와 비교. (Python 3에서 실행하십시오.2)

내가 질문자가 for`가 사용되는 루프하지만 이에 대한 개선이`for` 루프에 대한 필요성을 제거하기 위해`all`와`지도`기능을 사용하는 것 '을 요청 알고
>>> text = "Palindrome" 
>>> text[::-1] 
'emordnilaP' 
>>> text == text[::-1] 
False 
>>> text = "PalindromemordnilaP" 
>>> text == text[::-1] 
True