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
