![]() |
Palindrome Test - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: General (https://python-forum.io/forum-1.html) +--- Forum: Code sharing (https://python-forum.io/forum-5.html) +--- Thread: Palindrome Test (/thread-16525.html) |
Palindrome Test - mcmxl22 - Mar-03-2019 A little program to test if a word or phrase is a palindrome. word = input('Enter a word or phrase. ') letters = filter(str.strip, list(word)) test = list(reversed(word)) letter_test = filter(str.strip, test) if list(letter_test) == list(letters): print(f'{word} is a palindrome!') else: print(f'{word} is not a palindrome!') RE: Palindrome Test - perfringo - Mar-04-2019 Observation: this code fails on words/sentences which are considered palindromes: those which start with capital letters (Never odd or even) or containing punctuation and word dividers (Madam, I'm Adam). RE: Palindrome Test - DeaD_EyE - Mar-04-2019 You could use IndexAccess on strings. word.lower() == word.lower()[::-1]Just make the word lowercase, before you compare them. RE: Palindrome Test - perfringo - Mar-04-2019 Another way is to write function with short-circuit i.e if first non-match encountered then False is returned. Text cleaning must be performed, this is somewhat easier with built-in tools if you need to test only in english; for other languages one could define allowed letters manually (or exclude punctuation). One way of accomplishing it (it will ignore non-ascii characters, depending on use-case it may be a problem, using 'if letter not in string.punctuation' might be an alternative): >>> import string >>> def palindrome_check(text): ... cleaned = [letter.lower() for letter in text if letter in string.ascii_letters] ... for forward, backward in zip(cleaned, cleaned[::-1]): ... if forward != backward: ... return False ... return TrueOf course, there is built-in function all() exactly for that purpose: >>> import string >>> def palindrome_check(text): ... cleaned = [letter.lower() for letter in text if letter in string.ascii_letters] ... return all(forward == backward for forward, backward in zip(cleaned, cleaned[::-1])) RE: Palindrome Test - DeaD_EyE - Mar-04-2019 If you are trying to save memory with palindrome_check , you should use reversed instead the use of index access. The index access creates a new list in memory. The reversed object is evaluated lazy.But this is not important for words. With very long text, this can make sense. RE: Palindrome Test - perfringo - Mar-04-2019 (Mar-04-2019, 12:29 PM)DeaD_EyE Wrote: If you are trying to save memory with You are absolutely right. RE: Palindrome Test - rootVIII - Mar-05-2019 Here's a recursive solution that almost gave me an aneurysm: #! /usr/bin/python3 from sys import argv, exit def is_palindrome(s): if s != '': if s[0] != s[-1]: return False return is_palindrome(s[1:-1]) return True if __name__ == "__main__": if len(argv) < 2: print("Enter a word as an argument") exit() print(is_palindrome(argv[1])) |