سؤال

Given below is the code to check if a list is a palindrome or not. It is giving correct output for 983. Where am I going wrong?

def palindrome(num):
    flag=0
    r=num[::-1]
    for i in range (0, len(num)-1):
        if(r[i]==num[i]):
            flag=1
        else:
            flag=0
    return flag
هل كانت مفيدة؟

المحلول

You should return as soon as there is a mismatch. Also, you just need to iterate till half the length:

def function(...):
    ...
    for i in range (0, (len(num) + 1) / 2):
        if r[i] != num[i]:
            return False
    return True

BTW, you don't need that loop. You can simply do:

def palindrome(num):
    return num == num[::-1]

نصائح أخرى

This would be easier:

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

Your for loop checks all pairs of characters, no matter if it found mismatch or not. So, in case of string '38113' it will return True, because the flag variable will be set to True after the check for equality of last digit in '38113' and its reversed version '31183' (both equal to 3, while the string isn't a palindrome).
So, you need to return False right after you've found mismatch; if you checked all the characters and didn't find it - then return True, like so:

def palindrome(num):
    r = num[::-1]
    for i in range (0, len(num)-1):
        if(r[i] != num[i]):
            return False
    return True  

Also, as someone pointed out it'll be better to use python's slices - check out the documentation.

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[-1]:
            is_palindrome = False
        else:
            letters.pop(0)
            if len(letters) > 0:
                letters.pop(-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
str1=str(input('enter string:'))
save=str1
revstr=str1[::-1]
if save==revstr:
     print("string is pailandrom")
else:
     print("not pailadrom")
# We are taking input from the user.
# Then in the function we are reversing the input i.e a using 
# slice     [::-1] and 
# storing in b
# It is palindrome if both a and b are same.

a = raw_input("Enter to check palindrome:") 
def palin():
    #Extended Slices to reverse order.
    b = a[::-1]
    if a == b:
        print "%s is palindrome" %a
    else:
        print "%s is not palindrome" %a
palin()

this would be much easier:

def palindrome(num):
    a=num[::-1]
    if num==a:
        print (num,"is palindrome")
    else:
        print (num,"is not palindrome")

x=input("Enter to check palindrome:")
palindrome(x)

Here in my opinion is the most elegant:

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

it's also the same code in the is_palindrome() function:

pip install is-palindrome


>>> from is_palindrome import is_palindrome
>>> x = "sitonapanotis"
>>> y = is_palindrome(x)
>>> y
True

Take care to note the hyphen vs underscore when installing vs. importing

a="mom"
b='mom'[::-1]  # reverse the string
if a==b:  # if original string equals to reversed
    print ("palindrome ")
else:
    print ("not a palindrome ")
def palindrome(a):
     a=raw_input('Enter :')
     b=a[::-1]
     return a==b
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top