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 :

Création d'un mot probleme avec "str"


Sujet :

Python

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 33
    Points : 12
    Points
    12
    Par défaut Création d'un mot probleme avec "str"
    Salut à tous !

    voila j'ai un petit soucis je vous met mon code et le message d'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import random
    n=input('entrer le nombre de lettre du mot ')
    l1=[]
    a=0
    l=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
    while a<n:
        x=random.randrange(1,27)
        x=x-1
        l1=l1+l[x]
        a=a+1
    print l1
    Traceback (most recent call last):
    File "C:/Users/Utilisateur/Desktop/python/test1.py", line 9, in <module>
    l1=l1+l[x]
    TypeError: can only concatenate list (not "str") to list
    >>>



    voila je comprend pas car x est un nombre pas une chaine de caractere :/

    Merci d'avance !

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    l1 est une liste
    x est un entier
    l[x] est une chaîne de caractère (de longueur 1)
    l1 + l[x] est donc une tentative de concaténer une liste en une chaîne de caractère.

    essaie plutôt: l1.append(l[x])

    au fait l pourrait plus simplement être déclaré: l = "abcdefghijklmnopqrstuvwxyz"

  3. #3
    Nouveau membre du Club Avatar de arnaudk
    Inscrit en
    Février 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 38
    Points : 36
    Points
    36
    Par défaut
    Effectivement x est un nombre, et donc l[x] désigne l'élément de la liste l situé à l'indice x, donc d'après ton code c'est une lettre de l'alphabet et bien un string.

    Donc si tu veux ajouter cet élément à ta liste l, tu peux par exemple utiliser la méthode append :


  4. #4
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    Salut,



    Tu incrémentes la référence a de 0 à n-1 sans que la valeur de a soit utilisée quelque part dans le programme: c'est manifestement un compteur pour faire randrange() n fois.

    C'est beaucoup mieux de faire ce comptage par
    for a in xrange(n):





    Comme l'a dit dividee
    l = "abcdefghijklmnopqrstuvwxyz" est mieux aussi

    Un des buts de l'exercice était de comprendre qu'une chaine de caractère était aussi une liste....
    http://www.developpez.net/forums/d88...n/#post5056496




    Au lieu de prélever des lettres via des indices sortis au hasard, il faut d'abord se dire qu'il existe certainement une fonction qui prélève directement des lettres au hasard dans l'alphabet.
    D'autant plus que:

    je n'arrive pas à faire marcher random.choice([1,2,3])
    http://www.developpez.net/forums/d88...n/#post5055782
    j'ai par exemple une liste l=['a','b','c'].....comment prendre au hasard a , b ou c ? merki !!!
    http://www.developpez.net/forums/d88...n/#post5056024

    mot = 'xyz'
    for i in range(5): print random.choice(mot),
    http://www.developpez.net/forums/d88...n/#post5056496





    Tu n'as pas su exploiter le message d'erreur.
    Il ne te dit pas que x est un string.
    Le mieux qu'on ait à faire face à un message d'erreur, c'est de privilégier l'idée que c'est lui qui a raison et non pas soi même.






    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x=random.randrange(1,27)
    x=x-1
    Tout ça pour que x prenne une valeur au hasard entre 0 et 25.
    Là encore il faut se dire que si Python est capable de prélever au hasard dans un range de 1 à 26 compris, ce serait lamentable s'il n'arivait pas à faire un prélèvement dans un range de 0 à 25 compris.






    D'autre part créer x puis ajouter x à l1 est dilatoire: il faut mettre la valeur de x dans l 1en même temps qu'elle est créée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    l1.append(l[random.randrange(0,26)])
    ou mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    l1.append(random.choice(l))



    D'où

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import random
    n=input('entrer le nombre de lettre du mot ')
    l = 'abcdefghijklmnopqrstuvwxyz'
    l1=[]
    for a in xrange(n):
        li.append(random.choice(l))
    print l1




    NB
    La création de la liste l1 exprimée par les trois lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    l1=[]
    for a in xrange(n):
        li.append(random.choice(l))
    peut aussi être effectuée en faisant entrer les deux dernières lignes entre les crochets de la première ligne de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    li = [ random.choice(l) for a in xrange(n) ]
    Il s'agit là d'une écriture appelée list comprehension, mais c'est peut être au delà de ce qu'on te demande de savoir.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut utilisation de chr et ord
    Salut

    Python est 'listes' mais pas que...

    - W

    Code Python : 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
     
    import random
     
    ord_a = ord('a') # transforme 'a' en int valeur ascii de 'a'
    alphabet = ''
    for i in range(26):
        alphabet += chr(ord_a + i) # transforme valeur ascii en caractere
    # est ce que ca donne ce qu'on veut?
    print ('alphabet: %(alphabet)s' % vars())
     
    while True:
        try: # histoire d'attraper les erreurs d'entrees
            nombre_de_lettres =  input('entrer le nombre de lettre du mot : ')
        except Exception as e:
            print e
            continue
        if not nombre_de_lettres : 
            break # si 0 on sort...
        mot = '' # ben le mot est vide...
        for i in range(nombre_de_lettres):
            valeur = random.randint(0, 25)
            mot += chr(ord_a + valeur) # ajout du caractere...
        print 'le mot aleatoire est: %(mot)s' % vars()
    print 'Bye'
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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