Checking Palindrome text, with ignored punctuation marks, spaces and case

Question:

Homework exercise:
Checking whether a text is a palindrome should also ignore punctuation, spaces and case. For example, “Rise to vote, sir.” is also a palindrome but our current program doesn’t say it is. Can you improve the above program to recognize this palindrome?

origin code:

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 try:

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")

Error:

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 should I change my code?

Latest 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")

No matter what I input, output is Yes.

Enter text: hggjkgkkkk
Yes, it is a palindrome

What’s wrong?

Asked By: zoe_tang

||

Answers:

To ignore the punctuations, spaces and case of the given text you need to define a function remove_punctuations() which takes a word as parameter and returns a word with all lower case characters, remove punctuation marks and removed spaces.

To remove the unwanted characters we need to iterate over the given text, if the current character falls in strings.ascii_letters , then generate the character converting it to lower caps using str.lower() method. Finally using "".join() method to concatenate the generated str elements.

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")
Answered By: ZdaR
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 that helps

Answered By: Ivan Tolstosheyev

I started studying for python 2 days before so that is what i come up with.
It is not so much advanced but works like a charm. 😀
It is pretty straight forward what i do there. I just make a tuple with the “legal” letters (abc=). Then I define a function that 1st change all letters to lower case and then checks every character in the string with the “legal” letters. Then after this “filtering” the rawtext contains only the “legal” ones. Then the 2nd function just reverses the results of the 1st one. Compare and da da..!

# Palindrome recognize
abc='abcdefghijklmnopqrstuvwxyz'
def rawtext(text):
    rawtext=''
    text=text.lower()
    for j in text[::1]:
        for i in abc[::1]:        
            if j==i:                
                rawtext=rawtext+j
    return rawtext

def reverse(text):
    rev= rawtext(text)[::-1]   
    return rev

text=str(input('Write  text:'))

if reverse(text)==rawtext:
    print('The text is palindrome')
else:
    print('The text is not a palindrome')
Answered By: Giorgos Livanos

Since the hint says to use a tuple with forbidden punctuation marks, I created the following variant:

forbidden = (' ', ',', "'", '?', '!', '.', '’')


def reverse(text):
    return text[::-1]


def cleaning(text):
    clean_text = ''
    for item in text:
        if item not in forbidden:
            clean_text += item
    return clean_text


def is_palindrome(text):
    lower_text = cleaning(text.lower())
    return lower_text == reverse(lower_text)


example = input('Enter something: ')
if is_palindrome(example):
    print("Yes, it is a palindrome")
else:
    print("No, it is not a palindrome")

The cleaning function checks each character for belonging to a tuple of forbidden characters, if not, then concatenates it to the clean_text string

Answered By: Neron Kesar
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.