Як перевірити паліндром з використанням логіки Python

Я намагаюся перевірити паліндром з Python. Код, який я маю, дуже для -інтервалу.

І мені здається, найбільша помилка, яку роблять люди при переході від C до Python, намагається реалізувати C логіку, використовуючи Python, що робить речі повільними, і це просто не робить більшу частину мови.

Я бачу на цьому веб-сайті. Шукайте "C-стиль для", що у Python немає C-стилю для циклів. Може бути застарілим, але я розумію, що Python має свої власні методи для цього.

Я спробував озирнутися, я не можу знайти настільки актуальну (Python 3) поради для цього. Як я можу вирішити проблему паліндрому в Python, не використовуючи цикл for?

Я зробив це в класі C, але я хочу зробити це в Python, на особистій основі. Проблема пов'язана з проектом Ейлера , відмінним сайтом.

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

Я відсутній тут багато коду. П'ять хешей - це просто нагадування для себе.

Конкретні питання:

  1. У C я б зробив для циклу порівняння індексу 0 з індексом max, а потім індексу 0 + 1 з max-1, доки щось щось. Як найкраще це зробити в Python?

  2. Мій цикл for (в діапазоні (999, 100, -1), це поганий спосіб зробити це в Python?

  3. Хто-небудь має хороші поради або хороші веб-сайти, або ресурси для людей, які перебувають на моїй посаді? Я не програміст, я не прагну бути такою, я просто хочу навчитися достатньо, щоб, коли я пишу диплом бакалавра (електротехніку), мені не потрібно одночасно вивчати відповідну мову програмування при спробі отримати хороші результати в проекті. "Як перейти від базового C до великого застосування Python", такого роду речі.

  4. Будь-які конкретні біти коду, щоб зробити велике рішення для цієї проблеми, також будуть оцінені, мені потрібно вивчити хороші алгоритми .. Я передбачаю 3 ситуації. Якщо значення дорівнює нулю або одній цифрі, якщо вона має непарну довжину, і якщо вона має рівну довжину. Я планував написати для циклів ...

PS: Проблема полягає в наступному: Знайдіть продукт найвищого значення з двох 3-значних цілих чисел, що також є паліндром.

39
додано Автор Ashwini Chaudhary, джерело
Всі ці відповіді хороші, але майте на увазі, що, як сказано, ваше слово/фраза має бути точним паліндромом для них, включаючи великі літери, пробіли та розділові знаки. Ви хочете переглянути способи, як .lower() і .translate() , щоб зробити справу рівномірною і видалити пробіли і розділові знаки, якщо ви хочете, щоб відповідали випадки, подібні до - Чи бачать гуси Бога?
додано Автор Paul Griffiths, джерело
Я вважаю, що це ProjectEuler # 4. Ви повинні мати можливість знайти деякі рішення там, які могли б познайомити вас з Python. Але з точки зору цього, ваша реалізація не страшна. Ваш isPalindrome може бути набагато простішим. Ви також можете зберегти всі паліндроми, які ви знайдете у списку, а потім відсортувати їх, щоб знайти найвище значення. Якщо ви просто break , вам не гарантується найвищий показник palindrome.
додано Автор wflynny, джерело
@ PaulGriffiths Дякую, в цій конкретній програмі я маю справу з номерами, але я бачив функції .lower() і .upper (), .translate() Я розгляну. Дуже дякую!
додано Автор DrOnline, джерело

30 Відповіді

Пітонний спосіб визначення, чи є дане значення паліндромом:

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

Пояснення:

  • We're checking if the string representation of n equals the inverted string representation of n
  • The [::-1] slice takes care of inverting the string
  • After that, we compare for equality using ==
148
додано
Ця нарізка виглядає схожою з версією нарізки numpy . Тим не менш, я бачив, що numpy має кращу продуктивність, ніж ванільний пітон. Чи виконується ця операція з аналогічною швидкістю, ніж версія нульового масиву тієї ж операції?
додано Автор chase, джерело
Це не так. Вона просто перевіряє, що слово рівне самому собі назад. Перевагою python є те, що він дозволяє працювати на більш високому рівні абстракції, що призводить до більш чистих і елегантних рішень
додано Автор mariosangiorgio, джерело
@DrOnline Я оновив свою відповідь. Це пітонний спосіб написати рішення, маніпулюючи дуже гнучкою структурою даних списку, наданої мовою
додано Автор Óscar López, джерело
@DrOnline частина :: називається фрагментом , про це читайте в тут
додано Автор Óscar López, джерело
[:: - 1] - це розширена нарізка. [a: b: c] означає фрагмент від a (включно) до b (виключно) з розміром кроку c .
додано Автор wflynny, джерело
Спасибі, але що робить :: означаю, я подумав, що подібно до поділу для аргументів циклу, наприклад, для (int i = 0; i <this; i ++), що змушує мене читати [:: - 1] якийсь приріст. Це все неправильно? Як ви це називаєте, щоб я міг шукати його? фрагмент?
додано Автор DrOnline, джерело
Wow .. Чи можете ви пояснити мені, що це означає? Як може цей рядок містити логіку для порівняння крайнього лівого значення з правою краєм ..?
додано Автор DrOnline, джерело

Альтернативою синтаксису [:: - 1] є:

>>> test = "abcba"
>>> test == ''.join(reversed(test))
True

Функція reversed повертає зворотну послідовність символів у тесті test .

''.join() joins those characters together again with nothing in between.

22
додано
@RichieHindle: я знаходжу " Дійсно інтуїтивне поведінка буде, якщо ви можете написати test == reversed (test) . (Я не пускач.)
додано Автор Benjamin Hodgson, джерело
@downvoter: Догляд залишити коментар?
додано Автор RichieHindle, джерело
Ви можете зробити список (test) == list (зворотний (test)) .
додано Автор Rob, джерело
Дякую вам за допомогу, я тепер пишу її разом
додано Автор DrOnline, джерело

Тільки для запису, а для тих, хто шукає більш алгоритмічний спосіб перевірки, чи заданий рядок є паліндромом, два способи досягти цього (використовуючи while і for цикли ):

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

І .... другий:

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
7
додано

Чудова частина пітона - це те, що ви можете зробити з нею. Вам не потрібно використовувати індекси для рядків.

Наступне буде працювати (за допомогою фрагментів)

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

Вона просто перевертає n і перевіряє, чи вони рівні. n [:: - 1] змінює n (-1 означає декремент)

"2) Моя цикл for (в діапазоні (999, 100, -1), це поганий спосіб зробити це в Python?"

Що стосується вищевикладеного, ви хочете використовувати xrange замість діапазону (оскільки діапазон створить фактичний список, а xrange - швидкий генератор)

Мої думки щодо питання 3

Я довідався C перед Python, та я тільки прочитав документи, та грав навколо з це використовуючий console. (а також виконуючи завдання проекту Euler):

6
додано
Зауважте, що xrange потрібна (і тільки існує) тільки в Python 2. У Python 3 звичайний діапазон веде себе так само, як xrange , який використовується з декількома додатковими новими функціями, як, наприклад, нарізка, щоб додати інший об'єкт діапазон ).
додано Автор Blckknght, джерело
Без проблем! Якщо ви хочете отримати деякі індекси, використовуйте xrange . Якщо ви бажаєте отримати список і маніпулювати цим списком для іншого, використовуйте діапазон
додано Автор jh314, джерело
Дякую, я впроваджую зміни тепер, я також не був впевнений, що різниця між діапазоном і xrange, видно як у використанні. Дуже дякую ;)
додано Автор DrOnline, джерело
Завдяки Blckknght, я отримав помилки для xrange, було цікаво, якщо я повинен був включати бібліотеку або щось. Добре знати! Начебто сировина введення та введення було об'єднано для введення, я бачу, що це була зміна Python 3.
додано Автор DrOnline, джерело

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

Оптимізований код

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

Пояснення:

при пошуку рядка значення, яке повертається, є значенням місця, з якого починається рядок.

Тому, коли ви робите word.find (слово [:: - 1]) він знаходить nepalapen у місці 0 і [:: [1]

Тепер, коли ми шукаємо nepalapend , а потім повертаємо nepalapend до dnepalapen , він видає FALSE оператор nepalapend було змінено на dnepalapen , що призвело до того, що пошук не міг знайти nepalapend , що призвело до значення -1 , яке вказує, що рядок не знайдено.


Another method print true if palindrome else print false

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

output: TRUE

4
додано
Точно те, що я шукав. Спасибі.
додано Автор GeekRide, джерело

Також є функціональний спосіб:

def is_palindrome(word):
  if len(word) == 1: return True
  if word[0] != word[-1]: return False
  return is_palindrome(word[1:-1])
3
додано
Це має незначну помилку: "mannam" дасть IndexError: індекс рядка поза діапазоном , так як найбільш внутрішній виклик знаходиться на нульовому рядку (так само як і дає йому нульовий рядок). якщо len (word) <= 1: return True вирішує цю проблему, хоча буде розглядати нульові рядки як паліндроми.
додано Автор TemporalWolf, джерело
def is_palindrome(string):
   return string == ''.join([letter for letter in reversed(string)])
2
додано

Ось приклад, який приймає вхід користувача та перевіряє, чи є вхід паліндромом:

name = input("Write your word here:  ")
input("Press  to check if the word is a palindrome.")
if str(name) == str(name)[::-1]:
    print("True")
else:
    print("False")

Однак немає необхідності встановлювати оператор if / else . Ви можете безпосередньо надрукувати результат логічного порівняння, як показано тут:

name = input("Write your word here:  ")
input("Press  to check if the word is a palindrome.")
print(str(name) == str(name)[::-1])
1
додано
Будь ласка, поясніть свою посаду. Що він робить, щоб допомогти опитуваному? Як він повинен бути реалізований? Те, що вам очевидно, для інших може не бути очевидним.
додано Автор Jens, джерело

Я знаю, що на це питання давно відповіли, і я вибачаюся за вторгнення. Тим не менш, я працював над способом зробити це в Python, а також я просто думав, що я поділюся так, як я зробив це в наступному

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)
1
додано
#!/usr/bin/python

str = raw_input("Enter a string ")
print "String entered above is %s" %str
strlist = [x for x in str ]
print "Strlist is %s" %strlist
strrev = list(reversed(strlist)) 
print "Strrev is %s" %strrev
if strlist == strrev :
   print "String is palindrome"
else :
   print "String is not palindrome"
1
додано

Є набагато простіший спосіб, який я тільки що знайшов. Це всього лише 1 рядок.

is_palindrome = word.find(word[::-1])
1
додано
Ви можете зробити його логічним, тобто: is_palindrome = word.find (слово [:: - 1]) == 0 . Ще +1
додано Автор t.m.adam, джерело

це дуже просто

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

Дякую

1
додано
Це рішення вже пропонується, ви читаєте питання і стрибаєте, не читаючи доступних відповідей
додано Автор msudder, джерело

Це виглядає красивіше з рекурсією!

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
0
додано

Припускаючи рядок '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
0
додано

Тут функція нечутливий до регістру, оскільки всі вищезазначені рішення чутливі до регістру.

def Palindrome(string): 

  return (string.upper() == string.upper()[::-1]) 

Ця функція поверне значення boolean .

0
додано
В Python3.3 + скористайтеся
додано Автор Adam Smith, джерело

Якщо рядок має верхній або не алфавітний символ, функція перетворює всі символи в нижній регістр і видаляє всі неалфавітні символи за допомогою регулярного виразу, нарешті, застосовує перевірку palindrome рекурсивно:

import re

rules = [
    lambda s: any(x.isupper() for x in s),
    lambda s: not s.isalpha()
]


def is_palindrome(s):
    if any(rule(s) for rule in rules):
        s = re.sub(r'[^\w]', '', s).lower()
    if len(s) < 2:
        return True
    if s[0] != s[-1]:
        return False
    return is_palindrome(s[1:-1])


string = 'Are we not drawn onward, we few, drawn onward to new era?'

print(is_palindrome(string))

для вхідних даних виводиться True .

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

Справжній легкий спосіб зробити це

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

Та якщо/ще тут тільки для фантазії погляди. Питання про паліндром було на інтерв'ю Amazon для забезпечення якості

0
додано

"алгоритмічний" спосіб:

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
0
додано

роблячи курс Watterloo для python, ті ж питання виникають як "Lesseon" знайти інформацію тут:

http://cscircles.cemc.uwaterloo.ca/13-lists/

будучи новаком, я вирішив проблему таким чином:

def isPalindrome(S):
    pali = True
    for i in range (0, len(S)//2):
        if S[i] == S[(i * -1) - 1] and pali is True:
            pali = True
        else:
            pali = False
    print(pali)
    return pali

Функція називається isPalindrome (S) і вимагає рядка "S" . Повернення значення за замовчуванням - TRUE , щоб мати початкову перевірку першого оператора if.

Після цього цикл for виконує половину довжини рядка, щоб перевірити, що символ з рядка "S" у позиції "i" є однаковим у фронті та спина. Якщо це не так, функція зупиняється, виводить FALSE і повертає false.

Cheers.kg

0
додано

можливо, ви можете спробувати це:

list=input('enter a string:')

if (list==list[::-1]):
    print ("It is a palindrome")
else:
   print("it is not palindrome")
0
додано
Ласкаво просимо до StackOverflow. Ваша відповідь схожа на кілька інших, які вже були опубліковані, включаючи прийняту відповідь. Якщо ви вважаєте, що ваша відповідь інша, відредагуйте її, щоб додати деталі.
додано Автор anon, джерело

Ви запитуєте паліндром у python. паліндром можна виконувати на рядках, числах і списках. Тим не менш, я тільки що опублікував простий код для перевірки palindrome рядка.

# 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"
0
додано
word = ""
reverse = word[::-1] 
is_palindrome = word.find(reverse)
print is_palindrome

Це було питання в Udacity comp 101, глава 1. Дає 0 для паліндрома дає -1 для ні. Його просто, і не використовують петлі.

0
додано

Я написав цей код:

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

і це працює. він отримує слово, потім видаляє пробіли і перетворює його в список потім перевіряє, чи перша літера дорівнює останньому, а другий - 2-й останній і так далі.

тоді 'якщо x + 1 == len (слово)' означає, що, оскільки x починається з 0, це стає 1, а потім для кожного наступного .. blah blah blah працює так, що він працює.

0
додано
Вам потрібно правильне відступ або код не буде компілюватися!
додано Автор Jacob G., джерело
#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]
0
додано

Ви можете використовувати Deques у python, щоб перевірити 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

клас Deque:     def __init __ (self):         self.items = []     def is_empty (сам):         return self.items == []     def add_rear (self, item):         self.items.insert (0, елемент)     def add_front (сам, елемент):         self.items.append (елемент)     def size (self):         return len (self.items)     def remove_front (self):         return self.items.pop ()     def remove_rear (сам):         повернути self.items.pop (0)

0
додано
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')
0
додано

Існує інший спосіб використання функцій, якщо ви не хочете використовувати зворотний

#!/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")
0
додано
print ["Not a palindrome","Is a palindrome"][s == ''.join([s[len(s)-i-1] for i in range(len(s))])]

Це типовий спосіб написання одного рядкового коду

0
додано

Я спробував використати це:

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

і він працював для числа, але я не знаю, якщо рядок

0
додано
ІТ КПІ - Python
ІТ КПІ - Python
625 учасників

Канал обговорень про всякі штуки зі світу пайтону. Прохання: 0. мати повагу одне до одного; 1. не матюкатися в сторону людей; 2. не захламляти тред повідомленнями по одному слову;