Coucou Abdel,

Bien vu,  la variable n n'enregistrait pas la longueur de la liste, mais la 
longueur de l'expression.
D'où l'erreur.

Je retiens malgré tout les techniqes de raccourcissement du code que tu m'as 
montrées et les appliquerai désormais.

Amicalement,

Yannick Daniel Youalé
La programmation est une religion. Aimez-la, ou quittez-la.
www.visuweb.net

  ----- Original Message ----- 
  From: _Abdel_ 
  To: [email protected] 
  Sent: Tuesday, March 01, 2016 6:46 PM
  Subject: [progliste] Re: Python 3.x- difficulté avec les chaînes de caractères


  Salut Yannick,

  En espérant avoir bien compris ce qui te turlupine, j'ai remarqué qu'il y 
avait une petite erreur dans ta boucle par rapport aux index de la liste lst, 
dont tu voudrais mettre les éléments en minuscule.

  Je t'ai corrigé un petit peu ta fonction et t'y ai introduit un petit 
commentaire à ce sujet.

  J'ai mis le bloc qui pose problème en commentaire multiligne, grâce aux 
triples guillemets.

  Plus bas, je te suggère certaines simplifications, grâce aux compréhension de 
listes, qui sont très puissantes et très efficaces.

  Début de ta fonction corrigée.
  def getListNierestExpression(lst, expression):
      # renvoi la position de l'expression la plus proche contenue dans la 
liste ordonnée de manière croissante
      if expression=="": return 0
      # Dans l'instruction plus bas, tu initialises n au total des lettres de 
l'expression.
      # Et tu réutilises ce n, qui est pourtant indépendant de la liste lst, 
comme index dans cette liste lst.
      n=len(expression)
      #  élimination de la cass
      e=""
      i=0
      # C'est ici je pense, que l'erreur se produit, parce que l'index i, qui 
est extrait de l'expression, ne dois pas être utilisé comme index à la liste 
lst.
      """while(i<n-1):
       e=lst[i]
       e=e.lower()
       lst[i]=e
       i=i+1"""
      # end while
      # Je remplacerait plutôt cette expression par ce qui suit :
      for k in lst:
       lst[lst.index(k)] = k.lower()
      sp.window.alert(str(lst))
      expression=expression.lower()
      s=""
      pos=0
      selec=0
      flag=False
      # pour chaque lettres de l'expression
      for i in range(0, n-1):
       s=expression[0: i+1].lower()
       for j in range(pos, len(lst)-1):
        if lst[j].startswith(s):
         flag=True
         selec=j
         if i>=n-1: return selec
         pos=j+1
         break
        # end if
       # end for
      # end for
      return selec
  # end def
  Fin de ta fonction corrigée.

  Maintenant, Yannick, je vais te parler de la compréhension de liste, que tu 
dois certainement connaître mieux que moi lol !

  Si je te disais que toute ta fonction pourrait être réduite à une seule ligne?

  Qu'est-ce que tu dirais?

  En principe, ta fonction vérifie la présence de l'expression figurant en 
second paramètre dans la liste figurant en premier paramètre, et retourne 
l'index de la liste correspondant à cette expression.

  Voici un petit exemple avec les jours de la semaine, pour illustrer un peu 
mes propos.

  Chaque première lettre de chaque jour est mise en majuscule pour vérifier 
l'efficacité de la mise en minuscule.

  Voici donc notre liste de jours de la semaine :

  l=["Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "dimanche"]

  Voici maintenant, notre expression dont on souhaite retrouver l'index dans la 
liste :

  e = "mercr"

  # Maintenant, on teste ta fonction :
  pos = getListNierestExpression(l, e)

  print (pos) # Nous affiche 2 dans la console.

  C'est normal, l'élément "Mercredi" est en troisième position.

  Maintenant, avec une compréhension de liste.

  Si on veut obtenir l'index de l'élément correspondant à l'expression dans la 
liste :

  pos= [l.index(p) for p in l if e.lower() in p.lower()]

  print (pos) # Nous affiche [2], comme pour ta fonction.

  La seule différence, lorsqu'on utilise une compréhension de liste, c'est que 
l'élément en question est lui même une liste comportant un nombre d'élément 
déterminé, selon l'expression.

  Dans notre cas, il n'y en a qu'un seul.

  Mieux encore, si on veut avoir carrément l'élément correspondant dans la 
liste :

  element = [x for x in l if e.lower() in x.lower()]

  print (element) # Nous affiche carrément ['Mercredi'] !

  Après, pos[0] et element[0] feront le reste, en pointant directement sur 
l'élément en question.

  Voili voilou, en espérant avoir bien compris ton attente.

  Bien amicalement,
  Abdel.

    ----- Original Message ----- 
    From: Yannick Youalé 
    To: [email protected] 
    Sent: Tuesday, March 01, 2016 11:26 AM
    Subject: [progliste] Python 3.x- difficulté avec les chaînes de caractères


    Salut les mecs,

    Je travaille sur l'implémentation d'une intellicence pour le 6pad++ et 
rencontre un problème avec la gestion des chaînes de caractères par la classe 
str.

    Ayant récupéré et placé les mots clés à proposer dans un objet de type 
liste, je cherche à par tir  des premières lettres d'un mot clé tapé sous le 
curseur à déterminer quelle expression de la liste est la plus proche.

    Mon procédé est d'abord de mettre toutes les valeurs en minuscule avant de 
faire les comparaisons.

    Mais quand je teste les valeurs après les instructions de mise en 
minuscule, pas de changement de la cass. Des expressions sensées être en 
minuscule contiennent toujours des majuscules.

    Ca me casse la tête depuis ce matin.

    Je vous colle la fonction en question ci-dessous:

    Début du code python

    def getListNierestExpression(lst, expression):
     # renvoi la position de l'expression la plus proche contenue dans la liste 
ordonnée de manière croissante
     if expression=="": return 0
     n=len(expression)
     #  élimination de la cass
     e=""
     i=0
     while(i<n-1):
      e=lst[i]
      e=e.lower()
      lst[i]=e
      i=i+1
     # end while
     sp.window.alert(str(lst))
     #
     expression=expression.lower()
     s=""
     pos=0
     selec=0
     flag=False
     # pour chaque lettres de l'expression
     for i in range(0, n-1):
      s=expression[0: i+1].lower()
      for j in range(pos, len(lst)-1):
       if lst[j].startswith(s):
        flag=True
        selec=j
        if i>=n-1: return selec
        pos=j+1
        break
       # end if
      # end for
     # end for
     return selec
    # end def

    Fin du code python

    Quelqu'un pourrait-il expliquer le phénomène et avoir une solution ?

    Merci!

    Yannick Daniel Youalé
    La programmation est une religion. Aimez-la, ou quittez-la.
    www.visuweb.net




Répondre à