Comment vérifier palindrome en utilisant la logique Python [fermé]

J'essaie de vérifier un palindrome avec Python. Le code que j'ai est très for-boucle intensive.

Et il me semble que la plus grande erreur que les gens font en passant de C à Python est d'essayer d'implémenter la logique C en utilisant Python, ce qui fait que les choses fonctionnent lentement, et ce n'est tout simplement pas tirer le meilleur parti du langage.

Je vois sur ce site web. Recherchez "c-style for", que Python n'a pas de style C pour les boucles. Peut-être obsolète, mais je l'interprète comme signifiant que Python a le sien méthodes pour cela.

J'ai essayé de regarder autour de moi, Je ne trouve pas beaucoup de conseils à jour (Python 3) pour cela. Comment puis-je résoudre un défi palindrome en Python, sans utiliser la boucle for?

Je l'ai fait en C en classe, mais je veux le faire en Python, sur une base personnelle. Le problème vient du projet Euler , excellent site en passant,.

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

Il me manque beaucoup de code ici. Les cinq hachages ne sont que des rappels pour moi-même.

Béton questions:

  1. En C, je ferais une boucle for comparant index 0 à index max, puis index 0 + 1 avec max-1, jusqu'à ce que quelque chose quelque chose. Comment mieux faire cela en Python?

  2. Ma boucle for (dans l'aire de répartition (999, 100, -1), est-ce une mauvaise façon de le faire en Python?

  3. Est-ce que quelqu'un a de bons conseils, ou de bons sites web, ou des ressources pour les personnes dans mon poste? Je ne suis pas un programmeur, je n'aspire pas à en être un, je veux juste en apprendre assez pour que quand j'écris ma thèse de baccalauréat (Génie Électrique), Je n'ai pas à apprendre simultanément un langage de programmation applicable tout en essayant d'obtenir de bons résultats dans le projet. "Comment passer de C de base à une grande application de Python", ce genre de chose.

  4. Tous les bits de code spécifiques pour faire une excellente solution à ce problème seraient également appréciés, j'ai besoin d'apprendre de bons algorithmes.. J'envisage 3 situations. Si la valeur est zéro ou un seul chiffre, si elle est de longueur impaire, et si elle est de même longueur. J'avais l'intention d'écrire pour les boucles...

PS: le problème est: trouver le produit de la valeur la plus élevée de deux entiers à 3 chiffres qui est aussi un palindrome.

40
demandé sur Óscar López 2013-06-27 02:05:35

30 réponses

Une façon pythonique de déterminer si une valeur donnée est un palindrome:

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

Explication:

  • nous vérifions si la représentation de chaîne de n est égale à la représentation de chaîne inversée de n
  • La Tranche [::-1] prend soin d'inverser la chaîne
  • Après cela, nous comparons pour l'égalité en utilisant ==
150
répondu Óscar López 2013-06-26 22:08:00

Une alternative à la syntaxe [::-1] plutôt non intuitive est la suivante:

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

La fonction reversed renvoie une séquence inversée des caractères dans test.

''.join() joins ces personnages ensemble à nouveau avec rien entre les deux.

22
répondu RichieHindle 2013-06-26 22:17:56

Juste pour l'enregistrement, et pour ceux qui recherchent un moyen plus algorithmique de valider si une chaîne donnée est palindrome, deux façons d'obtenir la même chose (en utilisant while et for boucles):

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

Et....la seconde:

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
répondu Jorge E. Hernández 2016-06-13 05:23:42

La partie géniale de python est ce que vous pouvez faire avec. Vous n'avez pas besoin d'utiliser des index pour les chaînes.

Ce qui suit fonctionnera (en utilisant des tranches)

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

Ce qu'il fait est simplement inverse n, et vérifie si elles sont égales. n[::-1] inverse n (Le -1 signifie décrémenter)

"2) Ma boucle for (dans l'aire de répartition (999, 100, -1), est-ce une mauvaise façon de le faire en Python?"

En ce qui concerne ce qui précède, vous voulez utiliser xrange au lieu de range (car range créer une liste réelle, alors que xrange est un générateur rapide)

Mon avis sur la question 3

J'ai appris C avant Python, et je viens de lire les documents, et j'ai joué avec en utilisant la console. (et en faisant des problèmes de projet Euler aussi:)

6
répondu jh314 2013-06-26 22:14:27

Ci-Dessous le code d'impression 0 si c'est Palindrome else, il permet d'imprimer -1

Code Optimisé

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

Sortie: 0

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

Sortie: -1

Explication:

Lors de la recherche la chaîne de la valeur retournée est la valeur de l'emplacement que la chaîne commence.

Ainsi, lorsque vous vous word.find(word[::-1]), il trouve nepalapen emplacement 0 et [::-1] renverse nepalapen et il l'est toujours nepalapen emplacement 0, donc 0 est retourné.

Maintenant, lorsque nous recherchons nepalapend et que nous inversons nepalapend vers dnepalapen, une instruction FALSE nepalapend a été inversée vers dnepalapen, ce qui fait que la recherche ne parvient pas à trouver nepalapend résultant en une valeur de -1 qui indique une chaîne introuvable.


Une Autre méthode d'impression true si palindrome else print false

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

Sortie: Vrai

4
répondu Ganesh Pandey 2016-06-17 10:36:08

Il y a aussi une manièrefonctionnelle :

def is_palindrome(word):
  if len(word) == 1: return True
  if word[0] != word[-1]: return False
  return is_palindrome(word[1:-1])
3
répondu Khozzy 2016-10-03 10:51:54

Je sais que cette question a été répondue il y a un moment et j'appologize pour l'intrusion. Cependant, je travaillais sur une façon de le faire en python aussi et je pensais juste que je partagerais la façon dont je l'ai fait est la suivante,

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
répondu sanster9292 2015-12-29 07:11:35

Il y a beaucoup plus facile que je viens de trouver. C'est seulement 1 ligne.

is_palindrome = word.find(word[::-1])
1
répondu Inna Bohdanova 2016-03-21 18:07:22

Voici une fonctioninsensible à la casse puisque toutes les solutions ci-dessus sont sensibles à la casse.

def Palindrome(string): 

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

Cette fonction renverra une valeurbooléenne .

0
répondu Chaker 2015-01-27 20:34:22

Faire le cours Watterloo pour python, les mêmes questions sont soulevées comme un "Lesseon" trouver l'info ICI:

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

Étant un novice, j'ai résolu le problème de la manière suivante:

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

La fonction est appelée isPalindrome(S) et nécessite une chaîne de caractères "S". La valeur de retour est par défaut TRUE , pour avoir la vérification initiale sur la première instruction if.

Après cela, la boucle for s'exécute à moitié la longueur de la chaîne pour vérifier si le caractère de string "S" à la position "i" est le même à partir de l'avant et de l'arrière. Si une fois ce n'est pas le cas, la fonction s'arrête, imprime FALSE et renvoie false.

Cheers.kg

0
répondu bausi2k 2015-10-01 13:47:44

Si la chaîne a un caractère majuscule ou non alphabétique, la fonction convertit tous les caractères en minuscules et supprime tous les caractères non alphabétiques en utilisant regex enfin, elle applique la vérification palindrome récursivement:

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

La sortie est True pour l'entrée ci-dessus.

0
répondu ufukomer 2016-03-03 09:24:28

Peut-être que vous pouvez essayer celui-ci:

list=input('enter a string:')

if (list==list[::-1]):
    print ("It is a palindrome")
else:
   print("it is not palindrome")
0
répondu priya 2016-03-21 03:37:29

Vous demandez palindrome en python. palindrome peut être effectué sur des chaînes, des nombres et des listes. Cependant, je viens de poster un code simple pour vérifier le palindrome d'une chaîne.

# 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
répondu techno vimal 2016-04-15 11:29:42

Le vrai moyen facile de le faire est

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

Et si / sinon ici juste pour les regards de fantaisie. La question sur palindrome était sur L'interview D'Amazon pour QA

0
répondu Nik Latkin 2016-07-15 14:16:36

En supposant une chaîne ' 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
répondu blueskin 2016-07-29 02:20:40
word = "<insert palindrome/string>"
reverse = word[::-1] 
is_palindrome = word.find(reverse)
print is_palindrome

C'était une question dans Udacity comp 101, chapitre 1. Donne un 0 pour palindrome donne un -1 pour non. C'est simple, et n'utilise pas de boucles.

0
répondu siddhartha pachhai 2017-02-08 03:02:41

J'ai écrit ce 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")

Et ça marche. il obtient le mot, puis supprime les espaces et se transforme en une liste ensuite, il teste si la première lettre est égal à la dernière et si le 2ème est égale à la 2e dernier et ainsi de suite.

Alors le ' if x + 1 = = Len (word)' signifie que puisque x commence à 0 Il devient 1 et ensuite pour chaque suivant .. bla bla bla ça marche donc ça marche.

0
répondu Zaryab Khan 2017-04-08 01:33:28
#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
répondu lllll 2017-05-28 19:31:13

Vous pouvez utiliser Deques en python pour vérifier 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)

0
répondu Nabaz 2017-06-02 17:08:35
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
répondu John Hutchinson 2017-06-25 01:53:27

La manière "algorithmique":

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
répondu sargeMonkey 2017-07-04 01:45:30

Il existe un autre moyen d'utiliser des fonctions, si vous ne voulez pas utiliser 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")
0
répondu Deba G 2017-07-08 06:50:27

Il semble plus joli avec la récursivité!

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
répondu HarAdams 2017-11-21 16:26:22
print ["Not a palindrome","Is a palindrome"][s == ''.join([s[len(s)-i-1] for i in range(len(s))])]

C'est la manière typique d'écrire le code d'une seule ligne

0
répondu Tarun 007 2018-06-21 07:55:44
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
répondu ravi tanwar 2018-07-03 19:12:41

J'ai essayé d'utiliser ceci:

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

Et cela a fonctionné pour un nombre mais je ne sais pas si une chaîne

0
répondu mr rasp-crazy 2018-08-01 03:35:36
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) 

Sortie

testset True
testsest False
0
répondu Its not blank 2018-09-29 19:28:20

Voici un exemple de l'entrée d'un utilisateur et vérifie si l'entrée est un palindrome:

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

Cependant, il n'est même pas nécessaire de configurer le if/else déclaration. Vous pouvez directement imprimer le résultat de la comparaison logique, comme indiqué ici:

name = input("Write your word here:  ")
input("Press <enter> to check if the word is a palindrome.")
print(str(name) == str(name)[::-1])
-1
répondu alxxas 2016-02-14 23:54:18
#!/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
répondu tkhanna 2016-02-21 14:01:11

C'est très facile

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

Merci

-1
répondu Vaibhav Singh 2017-08-17 06:20:37