2012-12-20 6 views
5

Attualmente sto lavorando su un rivelatore palindromo (anna, lol, hahah ecc.) E mi viene richiesto di usare for-loops.For-loops in Python 3.0

Desidero che il programma esegua il ciclo di due stringhe (leggerle regolarmente e all'indietro contemporaneamente confrontando i valori). Se i valori sono uguali, il palindromo è True; se no, è Falso.

La mia domanda per voi è: come si ottengono due cicli for per eseguire simultaneamente e confrontare i valori delle stringhe?

Attualmente fare qualcosa di simile: (Python 3.0), può inviare intero codice, se necessario:

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 

Grazie per il vostro aiuto!

MODIFICA: Potrei non essere stato abbastanza chiaro quando ho descritto il problema. Il programma esegue questa operazione: Consente all'utente di immettere una stringa di testo (ad esempio ciao il mio nome è lol) e il programma è progettato per verificare se si tratta di un palindromo. È diviso in tre funzioni (e una funzione principale).

La funzione numero 1 corregge il testo in modo da ridurlo in caratteri e solo cifre (quindi LOL ,,,,, diventa lol per facilitare la lettura). La funzione numero 2 è progettata per testare (utilizzando i cicli for-loop (!)) Se l'input è un palindromo. La funzione numero 3 sta semplicemente postando se si tratta di un palindromo oppure no.

ho devo da utilizzare per-loop per questo e non posso semplicemente fare un confronto come ad esempio: backwardtext = text.reverse() se backwardtext == testo: print ("E 'un palindromo")

Spero che questo chiarisca le cose.

risposta

8

si utilizza zip

s = 'hannah' 

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

Forse un approccio livello leggermente inferiore potrebbe essere quella di un ciclo su indici (di cui gli oggetti sono indicizzabile):

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 

Per i visitatori futuri, questi non affrontare tutti i vincoli del problema, ma il modo più semplice per verificare se una stringa è un palindrome in python è semplicemente fare:

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

So che l'interrogante chiede 'for' loop da utilizzare, ma un miglioramento su questo sarebbe quella di utilizzare le funzioni' 'all' e map' per rimuovere la necessità di un' ciclo for' del tutto. – Will

+0

@Will - La cosa più semplice qui è solo fare 's == s [:: - 1]'. Questo è chiaramente il più pignolo. Tuttavia, il ciclo è indicato come parte del vincolo sul problema. È importante che OP capisca cosa 'zip' fa e come funzioni. Forse questo è parte di ciò che l'incarico sta facendo. Lanciare in una 'map' e un' all' non è di aiuto in questo. :) – mgilson

+0

Questo è chiaramente un compito di programmazione volto a ottenere la conoscenza dei costrutti di looping. Stavo solo cercando di sottolineare che in alcuni casi i loop espliciti possono essere rimossi del tutto attraverso l'uso della mappa/ridurre la programmazione di stile. – Will

3

È possibile utilizzare zip().

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

I zip() funzione itera oltre due iterables in parallelo, fermandosi al termine più breve:

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

string è ussualy nome di build nel modulo –

+1

@ralu: Ma poiché Python utilizza lo scoping lessicale, va bene usare le variabili locali che sono in conflitto con i nomi dei moduli. –

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

Basta confrontarlo stessa all'indietro. (Esegui in Python 3.2)

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