2012-12-20 8 views
5

Obecnie pracuję nad detektorem palindromowym (anna, lol, hahah itp.) I jestem proszony o użycie pętli for-loop.For-loopy w Pythonie 3.0

Chcę, aby program przechodził przez dwa ciągi (czytaj je regularnie i wstecz w tym samym czasie podczas porównywania wartości). Jeśli wartości są takie same, to palindrom ma wartość True; jeśli nie, to jest fałszywe.

Moje pytanie brzmi: w jaki sposób można uruchomić jednocześnie dwie pętle for i porównać wartości łańcuchów?

Obecnie robi coś takiego: (Python 3.0), można w razie potrzeby pisać cały kod:

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 

Dziękujemy za pomoc!

EDIT: Mogłem nie być wystarczająco jasne, opisując problem. Program robi to: Pozwala użytkownikowi wprowadzić ciąg tekstu (np. Hello, moje imię to lol), a program służy do sprawdzenia, czy jest to palindrom. Jest on podzielony na trzy funkcje (i główną funkcję).

Funkcja numer 1 powoduje skorygowanie tekstu, tak aby został zredukowany tylko do znaków i cyfr (tak, aby LOL ,,,,,, zmienił się w Lol dla łatwiejszego odczytu). Funkcja numer 2 została zaprojektowana do testowania (używając pętli for (!)), Jeśli wejście jest palindromem. Funkcja numer 3 po prostu opublikuje, czy jest to palindrom, czy nie.

mam użyć do-pętli na to i nie mogę po prostu zrobić porównanie takie jak: backwardtext = text.reverse() jeśli backwardtext == tekst: print ("To jest palindrom")

Mam nadzieję, że to wszystko wyjaśni.

Odpowiedz

8

użyć zip

s = 'hannah' 

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

Może podejście nieznacznie niższy poziom byłby do pętli na indeksach (przewidziane swoje elementy są indexible):

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 

Dla przyszłych użytkowników, są nie rozwiązuje wszystkich ograniczeń problemu, ale najprostszym sposobem sprawdzenia, czy łańcuch znaków jest palindromem w pythonie, jest po prostu:

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

wiem, że pytający pyta o 'for' pętle być używane, ale poprawa w tej sprawie byłoby użyć' all' i 'funkcje map' usunąć potrzebę' for' pętli całkowicie. – Will

+0

@Will - Najłatwiej jest po prostu zrobić 's == s [:: - 1]'. To najwyraźniej najbardziej pyton. Jednak pętla jest określona jako część ograniczenia problemu. Ważne jest, aby OP zrozumiał, czym jest "zip" i jak działa. Być może jest to częścią tego, do czego dąży zadanie. Rzucanie "mapą" i "wszystkim" nie pomoże w tym. :) – mgilson

+0

Jest to wyraźnie zadanie programistyczne mające na celu poznanie zapętlonych konstrukcji. Po prostu próbowałem zwrócić uwagę, że w niektórych przypadkach jawne pętle można usunąć całkowicie za pomocą mapowania/zmniejszenia stylu programowania. – Will

3

Można użyć zip().

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

W zip() funkcyjne iteracje nad dwoma iterables równolegle, zatrzymując się na końcu najkrótsza:

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

string to nazwa ussualy modułu wbudowanego –

+1

@ralu: Ale ponieważ Python używa zakresu leksykalnego, można używać zmiennych lokalnych, które kolidują z nazwami modułów. –

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

Wystarczy porównać ją do siebie tyłem. (Uruchom w Pythonie 3.2)

>>> text = "Palindrome" 
>>> text[::-1] 
'emordnilaP' 
>>> text == text[::-1] 
False 
>>> text = "PalindromemordnilaP" 
>>> text == text[::-1] 
True