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