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 :

Manipulation de chaines de caractères


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Par défaut Manipulation de chaines de caractères
    Salut à tous,

    Je viens juste de débuter à programmer en python. Alors que je m'exerçais sur un des exos de la partie concernant les Chaînes de caractères, je rencontre un problème de syntaxe.

    L'exercice est le suivant:
    Écrivez un script qui recopie une chaîne (dans une nouvelle variable), en insérant des astérisques entre les caractères.
    Ainsi par exemple, « gaston » devra devenir « g*a*s*t*o*n ».
    Je souhaiterai copier la chaîne, caractère par caractère.
    Pour se faire, j'utilise un code du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine2[i] = chaine1[i]
    J'obtiens malheureusement le message d'erreur suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeError: 'str' object does not support item assignment
    Pourriez vous s'il-vous-plait m'indiquer quelle instruction utiliser afin d'obtenir le résultat escompté.

    Merci d'avance

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Pour copier une chaîne, tu peux utiliser le slicing (prendre une sous-chaîne)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> a = "blabla"
    >>> b = a[::1]
    >>> a is b #Dit si a et b sont des références vers la même variable
    False
    Ça fonctionne aussi pour les listes et les tuples.

    Mais concernant ton exercice, tu n'as pas besoin de ça, tu peux te contenter de concaténer des morceaux.

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Par défaut
    Merci pour ton aide. Bien que je n'ai pas très bien compris ton code, mais je suppose que je verrais ça plus loin dans le cours.
    Pour l'exo j'ai regardé les corrections , j'avoue ne pas être très à l'aise avec les chaînes de caractères.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Mon code n'était là que pour te donner un exemple de manip pour copier une chaîne de caractères. Il s'agit de slicing :
    a[x:y:z] correspond à la chaîne (ou liste, ou tuple, selon le type de a) contenant les caractères (ou éléments) a[x], a[x+z], a[x+2*z] ... jusqu'à a[y] (exclu). y n'a pas besoin d'être de la forme a+k*z.
    Ici, j'utilise la forme contractée qui revient à prendre tous les éléments (du début à la fin par pas de 1).

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Je suppose que tu as pensé faire un programme du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ch1 = 'le petit chaperon rouge'
    ch2 = ''
     
    for i in range(len(ch1)):
        ch2[i] = ch1[i]
        ch2 = ch2 + '*'
     
    print ch2
    Le problème est le suivant:
    c'est qu'en écrivant ch2[i] on cherche à affecter une valeur à une position de la chaine ch2 à laquelle il n'y a encore aucun caractère: en fait la position n'existe pas.

    C'est la même chose pour une liste:
    si on essaye d'affecter une valeur à la position k d'une liste qui n'existe pas, il y a erreur: li[4] = '67' pour une liste qui ne comporte que 4 éléments (d'indices 0 à 3), il y a erreur.
    pour ajouter un élément à une liste il y a append():
    li.append('67')

    L'équivalent pou une chaine de caractères est de faire ch2 = ch2 + ch[i]

    Il te reste juste à ajouter le caractère '*' quelque part dans l'affaire pour obtenir la solution.

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    L'erreur que tu obtiens vient du fait qu'avec python, une chaine de caractère ne peut pas être modifiée "sur place": chaque modification entraine une recréation de la nouvelle chaine dans un autre endroit de la mémoire.

    Il existe de nombreuses solutions au problème qui t'est posé.

    Exemple 1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    x = "gaston"
     
    r = ""
    for c in x:
        r += c + '*'
    r = r[0:-1]
     
    print r
    g*a*s*t*o*n
    Remarque: le r = r[0:-1] permet d'éliminer le dernier '*' qui est en trop.

    Exemple 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    x = "gaston"
     
    r = "*".join([c for c in list(x)])
     
    print r
    g*a*s*t*o*n
    Si tu as besoin d'explications complémentaires, dis-le!

    Tyrtamos

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    C'est toujours un peu le même problème avec les posts qui posent des questions: il décrivent souvent de façon incomplète les problèmes.

    Il est tout à fait exact qu'on obtient le même message d'erreur avec les deux programmes suivants:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ch1 = 'le petit chaperon rouge'
    ch2 = ''
    for i in range(len(ch1)):
        ch2[i] = ch1[i]
    print ch2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ch1 = 'le petit chaperon rouge'
    ch2 = len(ch1)*' '
    for i in range(len(ch1)):
        ch2[i] = ch1[i]
    print ch2
    que la chaine ch2 existe ou non préalablement aux tentatives d'affecter des valeurs à ses positions.

    La raison de l'erreur est donc bien en réalité celle que décrit tyrtamos, plus générale que celle de l'inexistence de la chaine avant des affectations, à laquelle j'ai pensé en premier.


    -----------------

    J'ai pensé à plein de solutions , dont une avec zip(), une autre avec un qu'on remplit un caractère sur deux avec les caractères de ch1, mais c'est beaucoup plus compliqué qu'avec join() qui est parfaite et je ne me sens pas une ame de Shadock.Au contraire:

    Si li est une liste, lo = [ c for c in li] est évidemment li !
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x = "gaston"
    print "*".join(list(x))

    Maintenant, si on tient à faire un c for c in ... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x = "gaston"
    print "*".join([c for c in x])
    marche aussi.


    Mais le plus fort, c'est ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x = "gaston"
    print "*".join(x)
    !!

    Vive Python.

  8. #8
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Juillet 2006
    Messages : 233
    Par défaut repeter même carctère plusieur fois
    Je veux effectuer une boucle sur plusieurs lignes où sur la première j'imprime 1caratère, sur la deuxième deux caractères....jusqu'à la quinzième où je mettrai 15 caractères.
    J'ai pensé à la commande replicate que je connaissais je sais plus dans quel langage.

    Merci de votre aide.

  9. #9
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Citation Envoyé par maestro1303 Voir le message
    Je veux effectuer une boucle sur plusieurs lignes où sur la première j'imprime 1caratère, sur la deuxième deux caractères....jusqu'à la quinzième où je mettrai 15 caractères.
    J'ai pensé à la commande replicate que je connaissais je sais plus dans quel langage.

    Merci de votre aide.
    Bonjour,
    Il y a plusieurs choses à noter.
    - déterrer un sujet de 2008 n'est pas forcément pertinent. Un nouveau sujet expliquant en détails serait plus approprié.
    - faire une demande sans essayer de réaliser, ne serait-ce qu'un bout de code, peut poser problème.
    - enfin, la majeure partie de la réponse qui semble être recherchée a été donnée dans les réponses.

    M'enfin…
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    >>> txt = "abcdefghijklmno"
    >>> len(txt)
    15
    >>> for i in range(16):
    	print(txt[:i])
     
     
     
    a
    ab
    abc
    abcd
    abcde
    abcdef
    abcdefg
    abcdefgh
    abcdefghi
    abcdefghij
    abcdefghijk
    abcdefghijkl
    abcdefghijklm
    abcdefghijklmn
    abcdefghijklmno
    >>>
    Voilà, sinon, l'utilisation de la documentation présente sur le site (bouton tutoriels) permet d'accéder à la connaissance de base très rapidement.
    Clodion

Discussions similaires

  1. Comment manipuler une chaine de caractère
    Par belmehdi17 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 11/03/2008, 16h03
  2. Manipulation de chaine de caractères, supression d'une apostrophe
    Par pmithrandir dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 28/11/2007, 07h55
  3. Manipulation des chaines de caractères en c
    Par developppez dans le forum C
    Réponses: 8
    Dernier message: 29/04/2007, 13h04
  4. Réponses: 4
    Dernier message: 14/10/2006, 23h38
  5. Réponses: 4
    Dernier message: 20/08/2004, 10h59

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