chilliefiber
chilliefiber

Reputation: 651

Remove members of a list in another list

I'm writing a program that checks if a word or sentence given by user input is a palindrome or not. This is the program so far:

def reverse(text):
    a = text[::-1]
    if a == text:
        print "Yes, it's a palindrome."
    else:
        print "No, it's not a palindrome."

string = str(raw_input("Enter word here:")).lower()

reverse(string)

However, this code doesn't work for sentences. So I tried to do it like this:

import string

def reverse(text):
    a = text[::-1]
    if a == text:
        print "Yes, it's a palindrome."
    else:
        print "No, it's not a palindrome."

notstring = str(raw_input("Enter word here:")).lower()

liststring = list(notstring)

forbiddencharacters = string.punctuation + string.whitespace

listcharacters = list(forbiddencharacters)

newlist = liststring - listcharacters

finalstring = "".join(newlist)

reverse(finalstring)

My goal is to put the punctuation and whitespace into a list and then subtracting those characters to the input of the user so that the program can tell if it's a palindrome even if the string has punctuation and/or whitespace. However, I don't know how I can subtract the elements in a list to the elements in another list. The way I did it, by creating another list that equals the user input minus the characters doesn't work (I tried it in my Xubuntu terminal emulator). Apart from that, when I run the program this error appears:

Traceback (most recent call last):
  File "reverse.py", line 12, in <module>
    forbiddencharacters = string.punctuation + string.whitespace
AttributeError: 'str' object has no attribute 'punctuation'

Ok so I have changed the variable name and I don't get that mistake above. Now I still don't know how to subtract the elements of the lists.

Since I'm a beginner programmer this might seem stupid to you. If that's the case, I'm sorry in advance. If anyone can solve one or both of the two problems I have, I'd be extremely grateful. Thanks in advance for your help. Sorry for bad english and long post :)

Upvotes: 3

Views: 268

Answers (5)

Alfie
Alfie

Reputation: 2784

Checking for palindrome is simple,

This works for both words and sentences.

import string

def ispalindrome(input_str):
    input_str = list(input_str)
    forbidden = list(string.punctuation + string.whitespace)

    for forbidden_char in forbidden:              # Remove all forbidden characters
        while forbidden_char in input_str:
            input_str.remove(forbidden_char)
    return input_str == list(reversed(input_str)) # Checks if it is a palindrome


input_str = raw_input().lower()    # Avoid case issues
print ispalindrome(input_str)      # Get input

Upvotes: 0

Flavian Hautbois
Flavian Hautbois

Reputation: 3060

You should add some filtering along the way since palindromes have various syntax tricks (spaces, commas, etc.).

palindrome = "Rail at a liar"

def is_palindrome(text):
    text = text.lower()                               #Avoid case issues
    text = ''.join(ch for ch in text if ch.isalnum()) #Strips down everything but alphanumeric characters
    return text == text[::-1]

if is_palindrome(palindrome):
    print "Yes, it's a palindrome."
else:
    print "No, it's not a palindrome."

Upvotes: 4

user3378649
user3378649

Reputation: 5354

You can do that by splitting the phrase and storing it in a list. I am going to use your function (but there are more better pythonic ways to do that).

def reverse(textList1):
    textList2 = textList1[::-1]  #or we can use reversed(textList1)
    if textList2 == text:
        print "Yes, it's a palindrome."
    else:
        print "No, it's not a palindrome."

test1= "I am am I"

You should split the phrase and store it in a list:
test1List= test1.split(' ')

reverse(test1List)

Upvotes: 1

user590028
user590028

Reputation: 11730

A somewhat different approach to testing if a string is a palindrome

def palindrome(s):
    s = s.lower()
    ln=len(s)
    for n in xrange(ln/2):
        if s[n] != s[(ln-n)-1]:
            return False
    return True

print palindrome('Able was I ere I saw Elba')

FYI -- you'll need to tweak this to strip punctuation and white space if you like (left an an exercise to OP)

Upvotes: 1

wim
wim

Reputation: 362458

You are on the right track, but you have used the identifier string for two different purposes.

Since you assigned to this variable name with the line:

string = str(raw_input("Enter word here:")).lower()

You can now no longer access the attributes string.punctuation and string.whitespace from the import string, because the name string is no longer bound to the module but to the user input instead.

Upvotes: 1

Related Questions