Palindrome text validation with ignored punctuation marks, spaces and case
Homework: Checking if the text is a palindrome, also ignore punctuation marks, spaces and case. For example, "Please come up, sir." is also a palindrome, but our current program does not say it is. Can you improve the above program to recognize this palindrome?
source:
def reverse(text):
return text[::-1]
def is_palindrome(text):
return text == reverse(text)
something = input('Enter text: ')
if (is_palindrome(something)):
print("Yes, it is a palindrome")
else:
print("No, it is not a palindrome")
my attempt:
import re
def reverse(text):
global words
words = text.split()
return words[::-1]
def is_palindrome(text):
return words==reverse(text)
something = input('Enter text: ')
if (is_palindrome(something)):
print("Yes, it is a palindrome")
else:
print("No, it is not a palindrome")
Mistake:
Enter text: jfldj
Traceback (most recent call last):
File "/Users/apple/PycharmProjects/Problem Solving/user_input.py", line 13, in <module>
print("Yes, it is a palindrome")
File "/Users/apple/PycharmProjects/Problem Solving/user_input.py", line 10, in is_palindrome
NameError: name 'words' is not defined
How can I change the code?
Last code:
import string
def remove_punctuations(word):
return "".join(i.lower() for i in word if i not in string.ascii_letters)
def reverse(text):
return text[::-1]
def is_palindrome(text):
text = remove_punctuations(text)
return text == reverse(text)
something = input('Enter text: ')
if (is_palindrome(something)):
print("Yes, it is a palindrome"
else:
print("No, it is not a palindrome")
Whatever I input, the output is: Yes.
Enter text: hggjkgkkkk
Yes, it is a palindrome
What's wrong?
source to share
To ignore punctuation, spaces, and the case of a given text, you need to define a function remove_punctuations()
that takes a word as a parameter and returns a word with all lowercase characters, removes punctuation marks and removed spaces.
To remove unnecessary characters, we need to iterate over the given text if the current character falls into strings.ascii_letters
, then generate a character converting it to bottom caps using the method str.lower()
. Finally, using a method "".join()
to concatenate the generated items str
.
import string
def remove_punctuations(word):
return "".join(i.lower() for i in word if i in string.ascii_letters)
def reverse(text):
return text[::-1]
def is_palindrome(text):
text = remove_punctuations(text)
return text==reverse(text)
something = "Rise to vote, sir."
if (is_palindrome(something)):
print("Yes, it is a palindrome")
else:
print("No, it is not a palindrome")
source to share
from itertools import izip_longest
def is_palindrome(s):
l = len(s)
fi = (i for i in xrange(l) if s[i].isalpha())
bi = (i for i in xrange(l-1, -1, -1) if s[i].isalpha())
for f, b in izip_longest(fi, bi):
if f >= b: return True
if s[f].lower() != s[b].lower(): return False
return True
Hope it helps
source to share