Question sur un code en PYTHON

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour/soir, J'aimerais vous poser une question par rapport à un script en python dont le rôle est de dire si une phrase saisie par l'utilisateur est un palindrome ou non. voilà le code:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/usr/bin/python
#-*coding:Latin-1-*

phrase=raw_input("Saisir une phrase \n").lower()
nouvelle_phrase=""
phrase_inv=""
for i in range(len(phrase)):
    if phrase[i] != " ":
        nouvelle_phrase=nouvelle_phrase+phrase[i]
print(nouvelle_phrase)      
for j in range(len(nouvelle_phrase)):
    phrase_inv=nouvelle_phrase[j]+phrase_inv
print(phrase_inv)       
if nouvelle_phrase==phrase_inv:
    print("C'est un palindrome")
else:
    print("Ce n'est pas un palindrome")

j'ai une question pour :

for j in range(len(nouvelle_phrase)):

1
phrase_inv=nouvelle_phrase[j]+phrase_inv

Au départ j'ai essayé avec phrase_inv=phrase_inv+nouvelle_phrase[j] mais ça ne marchait pas car il trouvait que la phrase ou le mot était toujours un palindrome et la j'ai essayé avec ça et ça a marché.

Du coup ma question c'est phrase_inv=nouvelle_phrase[j]+phrase_inv et phrase_inv=phrase_inv+nouvelle_phrase[j] c'est différent ? C'est quoi les différences ? Pourquoi avec la deuxiéme version dès fois phrase_inv me donne la phrase inversée de nouvelle_phrase qui montre que celle-ci n'est pas un palindrome et dès fois elle me donne la même phrase qui détermine donc que la phrase est un palindrome.

Voilà merci d'avance ! :)

Édité par artragis

+0 -0
Staff

Salut,

Quand tu écris phrase_inv = phrase_inv + nouvelle_phrase[j], tu reconstitues en fait nouvelle_phrase, car tu ajoutes les lettres une à une à la fin de phrase_inv… Autant dire que tu ne fais rien !

Par contre, quand tu écris phrase_inv = nouvelle_phrase[j] + phrase_inv, tu ajoutes les lettres de nouvelles_phrase au début, et donc à la fin du script, la phrase est inversée.

Édité par Aabu

+0 -0

Salut,

Je trouve ton code compliqué pour vérifier qu’un mot est un palindrome. Ce que tu peux faire c’est une fonction qui tant que tu n’est pas arrivé au milieu du mot, vérifie les lettres de part et d’autre de son milieu.

Par exemple, avec le mot « abcca », on fait :

  • a == a, on continue ;
  • b != c, on retourne False.

Au contraire, avec le mot « abba », on fait :

  • a == a, on continue ;
  • b == b, on continue ;
  • on est arrivé au milieu du mot, on retourne True.

Édité par Karnaj

Je fais un carnage si ce car nage car je nage, moi, Karnaj ! - Tutoriels LaTeX - Contribuez à un tutoriel Ruby

+0 -0

Aabu a bien répondu à ta question : si l'addition de deux nombres est bien commutative (1 + 2 et 2 + 1 c'est la même chose, ce n'est pas le cas de la concaténation de chaînes de caractères : quand tu fais + sur une chaîne tu "rajoutes au bout de la chaîne" donc "zeste" + "savoir" == "zestesavoir" tandis que "savoir" + "zeste" == "savoirzeste").

Karnaj a donné une bonne réponse (c'est souvent la façon dont on vérifie qu'une chaîne de caractère est un palindrome d'ailleurs), ton approche (souvent moins efficace, mais plus naturelle) consiste à essayer de coder tout bêtement la définition d'un palindrome, à savoir : le mot est le même qu'on le lise dans un sens ou dans l'autre.

Tu es parti là-dessus en cherchant à déterminer phrase_inv (c'est normal), mais tu t'es compliqué la vie (notamment en faisant deux boucles et en n'utilisant pas de fonction de base). Tu devrais essayer de travailler ton code pour voir comment tu peux l'améliorer. Puis essayer d'implémenter la solution de Karnaj.

Essaie de déterminer la façon la plus simple (puis la plus efficace) de calculer phrase_inv. Y'en a plusieurs (dont une très élégante en utilisant les slices que tu ne connais sans doute pas encore, et une plus simple qui consiste à parcourir phrase une seule fois, mais dans l'ordre inverse).

Édité par Javier

Happiness is a warm puppy

+1 -0
Staff

Salut,

Peut-être l'objectif de ton exercice est de manipuler les indices, les boucles et les chaînes de caractère, donc ma réponse ne te satisfera pas dans ce cas.

Néanmoins, quand tu maîtriseras tout ça, tu pourras t'en sortir plus facilmeent avec un petit hack à la Python : pour renverser une liste ou une chaîne de caractère il te suffit d'utiliser la syntaxe [::-1].

1
2
def palindrome(mot):
    return mot == mot[::-1]

Et donc :

1
2
3
4
5
6
7
8
>>> palindrome("radar")  
... True  
>>> palindrome("kayak")  
... True  
>>> palindrome("lol")  
... True  
>>> palindrome("python")
... False  
+3 -0

Rhooo… Ce spoil…

Y'en a plusieurs (dont une très élégante en utilisant les slices que tu ne connais sans doute pas encore

C'est plus cool de laisser chercher :\

Happiness is a warm puppy

+0 -0
Staff

Voici un exercice plus dur pour me faire pardonner.

Tu dois créer un algo qui reconnaît la phrase "Un rOc, si bIscornu." comme étant un palindrome. Tu dois donc ignorer la ponctuation, les espaces, et être insensible à la casse.

+1 -0
Staff

En effet :

1
2
3
>>> import re
>>> re.sub(r'[^a-z]', '', 'Un rOc, si bIscornu.'.lower())
'unrocsibiscornu'

Édité par nohar

I was a llama before it was cool

+0 -0
Staff

Non les regex ne sont pas à considérer comme performantes dans le cas général. En tout cas pas celles standard de Python, POSIX, Perl ou PCRE. Elles se basent sur des automates non-déterministes et certaines de leurs fonctionnalités leur impose de faire du backtracking. Dans certains cas pathologiques tu peux avoir une complexité exponentielle.

Si tu as une solution évidente qui se passe de regex, ma guideline personnelle est de la préférer, à moins qu'elle soit beaucoup plus complexe (genre qu'elle fasse le double ou le triple de lignes).

J'ai un billet de tribune libre (ou un article) en préparation sur un sujet proche : https://github.com/ArnaudCalmettes/article_acora

Édité par nohar

I was a llama before it was cool

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte