IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

inversement de chaine avec [:]


Sujet :

Python

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 279
    Par défaut inversement de chaine avec [:]
    Bonjour,

    il y a différentes façons d'inverser une chaine de caractères en python.

    Ici, je m'intéresse à la façon de recopier une liste ( chaine ) avec [:]

    je commence tout d'abord par le classique pour être sûr:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    str1 = "bonjour"
    str2 = str1[0:len(str1):1]
    str3 = str1[:]
     
    print(str2)
    print(str3)


    j'obtiens deux fois "bonjour"
    J'en conclus que str3 est la version simplifiée de str2 et pour str2, on part du premier caractère jusqu'au dernier ( exclu ) de 1 en 1

    Si je souhaite inverser la chaine:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    str1 = "bonjour"
    str2 = str1[len(str1):0:-1]
    str3 = str1[::-1]
     
    print(str2)
    print(str3)

    En partant de ma réflexion plus haut, je pensais avoir encore deux fois le même résultat mais inversé.
    Hors, str3 donne bien la chaine inversée, mais il manque le b à la fin pour str2.
    Puisque le 0 est exclu, je conçois que le "b" manque, mais si str2 démarre à l'index len(str1), il devrait y avoir une erreur, non ?


    Donc, la question: [::-1] est la version simplifiée de quoi ?
    disons que je comprends bien [:], mais pour moi, [::-1] ne fonctionne pas de la même manière !
    Voilà: un petit détail qui me chagrine...

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 681
    Par défaut
    Salut,

    Intuitivement [::-1] devrait s'écrire len(s)-1:-1:-1
    On va du dernier caractère (len(s)-1) jusqu'au premier d'indice -1 car le dernier est exclu.

    Là ou la logique fout le camp, c'est avec l'interprétation des indices négatifs: -1 <=> len(s)-1: len(s)-1:-1 produira la chaîne vide.

    Du coup, si le dernier caractère a pour index -1, le dernier (en comptant en négatif) sera -(len(s)+1.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Ushuango Voir le message
    disons que je comprends bien [:], mais pour moi, [::-1] ne fonctionne pas de la même manière !
    Voilà: un petit détail qui me chagrine...
    Pour mieux comprendre, il faut déjà écrire l'expression exacte, c'est à dire sans les valeurs par défaut.
    Donc [:] c'est l'écriture simpifiée de [None:None:1] et [::-1] c'est [None:None:-1]. Et là, on voit que la syntaxe respecte toujours le même schéma "début:fin:incrément" et donc fonctionne bel et bien de la même manière.
    Ensuite, quand le début est à None, alors il part du début "logique" de la chaine. Et la "logique" s'établit selon l'incrément. S'il est positif, alors c'est que le but est de lire la chaine à priori dans le sens "normal" de lecture donc à partir du début. Et s'il est négatif, alors Python comprend que le but est de lire la chaine dans le sens inverse et partira de la fin.
    Et même réflexion quand la fin est à None.

    Si maintenant tu spécifies des bornes explicites, alors ce mécanisme ne s'applique plus et si tu écris par exemple [1:7:-1] tu n'auras bien évidemment rien du tout puisque aller de 1 à 7 par pas négatif n'est pas possible.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 279
    Par défaut
    Merci, je me doutais bien que je n'avais tout compris, mais j'ignorais le détail du None !!
    Mon problème vient du fait que je n'ai jamais lu ça quelque part...Il y a de la documentation la-dessus ?

    En tous cas, merci: explication très claire et donc enregistrée pour la suite de mon apprentissage !

  5. #5
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 510
    Par défaut
    Bonjour,

    Citation Envoyé par Ushuango Voir le message
    Il y a de la documentation la-dessus ?
    Oui. C'est là : https://docs.python.org/3/library/st...nce-operations

    Le fonctionnement de s[i:j:k] est expliqué ainsi dans les points 3 et 5 :
    • If i or j is negative, the index is relative to the end of sequence s: len(s) + i or len(s) + j is substituted. But note that -0 is still 0.
    • The slice of s from i to j with step k is defined as the sequence of items with index x = i + n*k such that 0 <= n < (j-i)/k. In other words, the indices are i, i+k, i+2*k, i+3*k and so on, stopping when j is reached (but never including j). When k is positive, i and j are reduced to len(s) if they are greater. When k is negative, i and j are reduced to len(s) - 1 if they are greater. If i or j are omitted or None, they become “end” values (which end depends on the sign of k). Note, k cannot be zero. If k is None, it is treated like 1.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Concatérner chaine avec retour à la ligne
    Par nebule dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 30/11/2004, 11h55
  2. [LG]Type chaine avec plus de 255 car et EOF intempestif.
    Par jpclabaux dans le forum Langage
    Réponses: 2
    Dernier message: 27/10/2004, 10h39
  3. Chaines avec caractères accentués dans interbase
    Par Tsimplice dans le forum Bases de données
    Réponses: 4
    Dernier message: 08/03/2004, 17h12
  4. [sous-chaine] Avec strpos ou substring ??
    Par terziann dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 17/07/2003, 15h28
  5. Script test de deux chaine avec if
    Par kacedda dans le forum Linux
    Réponses: 6
    Dernier message: 02/05/2003, 15h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo