DrOnline
DrOnline

Reputation: 741

How to check for palindrome using Python logic

I'm trying to check for a palindrome with Python. The code I have is very for-loop intensive.

And it seems to me the biggest mistake people do when going from C to Python is trying to implement C logic using Python, which makes things run slowly, and it's just not making the most of the language.

I see on this website. Search for "C-style for", that Python doesn't have C-style for loops. Might be outdated, but I interpret it to mean Python has its own methods for this.

I've tried looking around, I can't find much up to date (Python 3) advice for this. How can I solve a palindrome challenge in Python, without using the for loop?

I've done this in C in class, but I want to do it in Python, on a personal basis. The problem is from the Euler Project, great site By the way,.

def isPalindrome(n):
    lst = [int(n) for n in str(n)]
    l=len(lst)
    if l==0 || l==1:
        return True
    elif len(lst)%2==0:
        for k in range (l)
        #####
    else:
        while (k<=((l-1)/2)):
            if (list[]):
                #####   

for i in range (999, 100, -1):
    for j in range (999,100, -1):
        if isPalindrome(i*j):
            print(i*j)
            break

I'm missing a lot of code here. The five hashes are just reminders for myself.

Concrete questions:

  1. In C, I would make a for loop comparing index 0 to index max, and then index 0+1 with max-1, until something something. How to best do this in Python?

  2. My for loop (in in range (999, 100, -1), is this a bad way to do it in Python?

  3. Does anybody have any good advice, or good websites, or resources for people in my position? I'm not a programmer, I don't aspire to be one, I just want to learn enough so that when I write my bachelor's degree thesis (electrical engineering), I don't have to simultaneously LEARN an applicable programming language while trying to obtain good results in the project. "How to go from basic C to great application of Python", that sort of thing.

  4. Any specific bits of code to make a great solution to this problem would also be appreciated, I need to learn good algorithms.. I am envisioning 3 situations. If the value is zero or single digit, if it is of odd length, and if it is of even length. I was planning to write for loops...

PS: The problem is: Find the highest value product of two 3 digit integers that is also a palindrome.

Upvotes: 58

Views: 219973

Answers (30)

Srinivas Bn
Srinivas Bn

Reputation: 1

def palindrome_or_not(val):
    length = len(val)
    for i in range(length // 2):
        if val[i] != val[length - 1 - i]:
            return 'Not Palindrome'
    return 'Palindrome'

print(palindrome_or_not('malayalam'))

Upvotes: 0

Rodrigo Lucchesi
Rodrigo Lucchesi

Reputation: 1

This method can solve the issue:

def is_palindrome(word:str) -> bool:
    word_lst = list(word)
    if not word_lst and (len(word_lst)<=1) and (len(word_lst)>=10**5):
        return
    reversed_word_lst = word_lst[::-1]
    return word_lst == reversed_word_lst

Best!

Upvotes: 0

&#211;scar L&#243;pez
&#211;scar L&#243;pez

Reputation: 236004

A pythonic way to determine if a given value is a palindrome:

str(n) == str(n)[::-1]

Explanation:

  • We're checking if the string representation of n equals the reversed string representation of n
  • The [::-1] slice takes care of reversing the string
  • After that, we compare for equality using ==

Upvotes: 207

Ritik Sharma
Ritik Sharma

Reputation: 11

def palindrome(s):
if str(s) == str(s)[::-1]:
    return True
else:
    return False

Upvotes: -1

user12965285
user12965285

Reputation:

You could use this one-liner that returns a bool value:

str(x)==str(x)[::-1]

This works both for words and numbers thanks to the type casting...

Upvotes: 0

Giorgos Myrianthous
Giorgos Myrianthous

Reputation: 39810

The most pythonic way to do this is indeed using the slicing notation to reverse the string as mentioned already:

def is_palindrome(string: str) -> bool:
    return string == string[::-1]

In some other occasions though (like technical interviews), you may have to write a "proper" algorithm to find the palindrome. In this case, the following should do the trick:

def is_palindrome(string: str) -> bool:
    start = 0
    end = len(string) - 1
    
    while end >= start:
        if string[end] != string[start]:
            return False
        start += 1
        end -= 1
        
    return True
  • Set pointers to the start and end of the string
  • Iterate while end exceeds start
  • If the character in end and start indices don't match then this is not a palindrome, otherwise keep comparing
  • Increase start pointer by 1
  • Decrease end pointer by 1

Test Cases:

import unittest

class Test(unittest.TestCase):

    palindromes = ['a', 'aa', 'aba', '12321']
    non_palindromes = ['ab', 'aab', 'cacacc']
    def test_is_palindrome(self):
        for case in self.palindromes:
            self.assertTrue(is_palindrome(case))

        for case in self.non_palindromes:
            self.assertFalse(is_palindrome(case))


if __name__ == '__main__':
    unittest.main()

Upvotes: 1

manjunath
manjunath

Reputation: 35

Simple program to find and delete palindrome numbers.

list1 =  [12, 45, 98, 76,21, 89, 63,36,10]
list2 = list1.copy()
list3 = list1.copy()
for i in list1:
    for j in list2:
        tmp = str(j)
        if str(i) == tmp[::-1]:
           list3.remove(j)
    list2=list3.copy()
print ("final list",list3)

Upvotes: -1

sanster9292
sanster9292

Reputation: 1325

I know that this question was answered a while ago and i appologize for the intrusion. However,I was working on a way of doing this in python as well and i just thought that i would share the way that i did it in is as follows,

word = 'aibohphobia'

word_rev = reversed(word)

def is_palindrome(word):
    if list(word) == list(word_rev):
        print'True, it is a palindrome'
    else:
        print'False, this is''t a plindrome'

is_palindrome(word)

Upvotes: 1

Its not blank
Its not blank

Reputation: 3095

def isPalin(checkWord):
    Hsize = len(lst)/2
    seed = 1
    palind=True
    while seed<Hsize+1:
        #print seed,lst[seed-1], lst [-(seed)]
        if(lst[seed-1] != lst [-seed]):
            palind = False
            break
        seed = seed+1
    return palind

lst = 'testset'
print lst, isPalin(lst)    
lst = 'testsest'
print lst, isPalin(lst) 

Output

testset True
testsest False

Upvotes: 0

da coconut
da coconut

Reputation: 863

I tried using this:

def palindrome_numer(num):
num_str = str(num)
str_list = list(num_str)
if str_list[0] == str_list[-1]:
    return True
return False

and it worked for a number but I don't know if a string

Upvotes: 0

ravi tanwar
ravi tanwar

Reputation: 618

def pali(str1):
    l=list(str1)
    l1=l[::-1]
    if l1==l:
        print("yess")
    else:
        print("noo")
str1="abc"
a=pali(str1)
print(a)

Upvotes: 0

Tarun 007
Tarun 007

Reputation: 74

print ["Not a palindrome","Is a palindrome"][s == ''.join([s[len(s)-i-1] for i in range(len(s))])]

This is the typical way of writing single line code

Upvotes: 0

Lily P
Lily P

Reputation: 11

def is_palindrome(string):
   return string == ''.join([letter for letter in reversed(string)])

Upvotes: 0

Harrada
Harrada

Reputation: 83

It looks prettier with recursion!

def isPalindrome(x):
z = numToList(x)
length = math.floor(len(z) / 2)
if length < 2:
    if z[0] == z[-1]:
        return True
    else:
        return False
else:
    if z[0] == z[-1]:
        del z[0]
        del z[-1]
        return isPalindrome(z)
    else:
        return False

Upvotes: 0

Vaibhav Singh
Vaibhav Singh

Reputation: 59

it is very easy

#palindrome
a=raw_input("enter the word")
b=a[::-1]
if a==b:
 print("enter word is palindrome")
else:`enter code here`
 print("not a palindrome")

thanks

Upvotes: -2

Deba G
Deba G

Reputation: 9

There is another way by using functions, if you don't want to use reverse

#!/usr/bin/python

A = 'kayak'

def palin(A):

    i = 0
    while (i<=(A.__len__()-1)):
        if (A[A.__len__()-i-1] == A[i]):
            i +=1
        else:
         return False

if palin(A) == False:

    print("Not a Palindrome")

else :

    print ("Palindrome")

Upvotes: 0

sargeMonkey
sargeMonkey

Reputation: 696

the "algorithmic" way:

import math

def isPalindrome(inputString):
    if inputString == None:
        return False

    strLength = len(inputString)
    for i in range(math.floor(strLength)):
        if inputString[i] != inputString[strLength - 1 - i]:
            return False
    return True

Upvotes: 0

John Hutchinson
John Hutchinson

Reputation: 1

import string

word = input('Please select a word to test \n')
word = word.lower()
num = len(word)

x = round((len(word)-1)/2)
#defines first half of string
first = word[:x]

#reverse second half of string
def reverse_odd(text):
    lst = []
    count = 1
    for i in range(x+1, len(text)):

        lst.append(text[len(text)-count])
        count += 1
    lst = ''.join(lst)
    return lst

#reverse second half of string
def reverse_even(text):
    lst = []
    count = 1
    for i in range(x, len(text)):
        lst.append(text[len(text)-count])
        count += 1
    lst = ''.join(lst)
    return lst


if reverse_odd(word) == first or reverse_even(word) == first:
    print(string.capwords(word), 'is a palindrome')
else:
    print(string.capwords(word), 'is not a palindrome')

Upvotes: 0

Nabaz
Nabaz

Reputation: 1

You can use Deques in python to check palindrome

def palindrome(a_string): ch_dequeu = Deque() for ch in a_string: ch_dequeu.add_rear(ch) still_ok = True while ch_dequeu.size() > 1 and still_ok: first = ch_dequeu.remove_front() last = ch_dequeu.remove_rear() if first != last: still_ok = False return still_ok

class Deque: def __init__(self): self.items = [] def is_empty(self): return self.items == [] def add_rear(self, item): self.items.insert(0, item) def add_front(self, item): self.items.append(item) def size(self): return len(self.items) def remove_front(self): return self.items.pop() def remove_rear(self): return self.items.pop(0)

Upvotes: 0

lllll
lllll

Reputation: 37

#compare 1st half with reversed second half
# i.e. 'abba' -> 'ab' == 'ba'[::-1]

def is_palindrome( s ):
   return True if len( s ) < 2 else s[ :len( s ) // 2 ] == s[ -( len( s ) // 2 ):][::-1]

Upvotes: 0

Zaryab Khan
Zaryab Khan

Reputation: 1

I wrote this code:

word = input("enter: ")
word = ''.join(word.split())`
for x in range(len(word)):
if list(word)[x] == ((list(word)[len(word)-x-1])):
if x+1 == len(word):
print("its pali")

and it works. it gets the word, then removes the spaces and turns it into a list then it tests if the first letter is equal to the last and if the 2nd is equal to 2nd last and so on.

then the 'if x+1 == len(word)' means that since x starts at 0 it becomes 1 and then for every next .. blah blah blah it works so it works.

Upvotes: -1

hxalchemy
hxalchemy

Reputation: 374

word = "<insert palindrome/string>"
reverse = word[::-1] 
is_palindrome = word.find(reverse)
print is_palindrome

This was a question in Udacity comp 101, chapter 1. Gives a 0 for palindrome gives a -1 for not. Its simple, and does not use loops.

Upvotes: -1

Khozzy
Khozzy

Reputation: 1103

There is also a functional way:

def is_palindrome(word):
  if len(word) == 1: return True
  if word[0] != word[-1]: return False
  return is_palindrome(word[1:-1])

Upvotes: 3

Chenna V
Chenna V

Reputation: 10473

Assuming a string 's'

palin = lambda s: s[:(len(s)/2 + (0 if len(s)%2==0 else 1)):1] == s[:len(s)/2-1:-1]  
# Test
palin('654456')  # True
palin('malma')   # False
palin('ab1ba')   # True

Upvotes: 0

Niko Latkin
Niko Latkin

Reputation: 29

The real easy way to do that it is

word = str(raw_input(""))
is_palindrome = word.find(word[::-1])
if is_palindrome == 0:
    print True
else:
    print False

And if/else here just for fancy looks. The question about palindrome was on Amazon's interview for QA

Upvotes: -1

Ganesh Pandey
Ganesh Pandey

Reputation: 5276

Below the code will print 0 if it is Palindrome else it will print -1

Optimized Code

word = "nepalapen"
is_palindrome = word.find(word[::-1])
print is_palindrome

Output: 0

word = "nepalapend"
is_palindrome = word.find(word[::-1])
print is_palindrome

Output: -1

Explaination:

when searching the string the value that is returned is the value of the location that the string starts at.

So when you do word.find(word[::-1]) it finds nepalapen at location 0 and [::-1] reverses nepalapen and it still is nepalapen at location 0 so 0 is returned.

Now when we search for nepalapend and then reverse nepalapend to dnepalapen it renders a FALSE statement nepalapend was reversed to dnepalapen causing the search to fail to find nepalapend resulting in a value of -1 which indicates string not found.


Another method print true if palindrome else print false

word = "nepalapen"
print(word[::-1]==word[::1])

output: TRUE

Upvotes: 8

Jorge E. Hern&#225;ndez
Jorge E. Hern&#225;ndez

Reputation: 2938

Just for the record, and for the ones looking for a more algorithmic way to validate if a given string is palindrome, two ways to achieve the same (using while and for loops):

def is_palindrome(word):

    letters = list(word)    
    is_palindrome = True
    i = 0

    while len(letters) > 0 and is_palindrome:       
        if letters[0] != letters[(len(letters) - 1)]:
            is_palindrome = False
        else:
            letters.pop(0)
            if len(letters) > 0:
                letters.pop((len(letters) - 1))

    return is_palindrome

And....the second one:

def is_palindrome(word):

    letters = list(word)
    is_palindrome = True

    for letter in letters:
        if letter == letters[-1]:
            letters.pop(-1)
        else:
            is_palindrome = False
            break

    return is_palindrome

Upvotes: 15

techno vimal
techno vimal

Reputation: 1

You are asking palindrome in python. palindrome can be performed on strings, numbers and lists. However, I just posted a simple code to check palindrome of a string.

# Palindrome of string
str=raw_input("Enter the string\n")
ln=len(str)
for i in range(ln/2) :
    if(str[ln-i-1]!=str[i]):
        break
if(i==(ln/2)-1):
    print "Palindrome"
else:
    print "Not Palindrome"

Upvotes: 0

Inna Bohdanova
Inna Bohdanova

Reputation: 9

There is much easier way I just found. It's only 1 line.

is_palindrome = word.find(word[::-1])

Upvotes: 0

priya
priya

Reputation: 9

maybe you can try this one:

list=input('enter a string:')

if (list==list[::-1]):
    print ("It is a palindrome")
else:
   print("it is not palindrome")

Upvotes: -1

Related Questions