• # Correction

    Posté par (site web personnel) . En réponse au message problème message d'erreur python. Évalué à 4. Dernière modification le 09 mars 2019 à 12:52.

    Bon, ton code fait très programmation "C" avec un tableau de taille fixe dont on gère le nombre d'éléments séparément. En Python on a un type list qui est un conteneur dynamiques, qui dispose des opérateurs/méthodes: t.remove(valeur), del t[index]... et dont on peut connaître le nombre d'éléments len(t).

    Bref, tu fais du C en Python, qui plus est avec un algo très compliqué pour réaliser une opération simple. Mais en restant dans ton code, en ajoutant docstring et commentaires (conseil, fait le, même pour toi, ça permet quand on lit/écrit d'identifier des écarts entre ce qu'on pense que la fonction fait et ce qu'elle fait réellement), ça donnerais:

    def supprimer(t,n,k):
     "Supprime l'élément à l'index k dans t (de taille n) et retourne la nouvelle taille"
     for i in range(k,n-1):
     # On décale les éléments (les anciennes valeurs restent "à droite")
     t[i]=t[i+1]
     return n-1
    def supprimerPremiereOccurence(t,n,elt):
     "Supprime la première occurence de elt dans t (de taille n) et retourne la nouvelle taille de t"
     for i in range(n):
     # Recherche la première occurence, et appelle la fonction de suppression
     if t[i]==elt:
     return supprimer(t,n,i) # Retourne nouvelle taille du tableau
     # Si pas trouvé, la taille du tableau n'a pas changé !!!!!
     return n # <------------ ton bug était là: si elt n'est pas dans t, tu ne passes pas
     # par ton return et ça fait que ta fonction sort implicitement avec None,
     # qui se retrouve stocké dans nbelem, propagé dans n, puis qui provoque une 
     # comparaison NoneType avec int (n>0) au début de l'itération suivante.
    def mystere(t,n,x):
     "Supprime les éléments x de t (de taille n) et retourne la nouvelle taille de t"
     continuer = True
     while n>0 and continuer == True:
     nbelem = supprimerPremiereOccurence(t,n,x)
     if nbelem == n:
     continuer = False
     else:
     n = nbelem
     return n
    liData = [2,-7,4,5,12,10,4,2,4,-18]
    print(mystere(liData,len(liData),4))

    Note: Là on fait directement des modifications dans la liste passée en paramètre ; s'il n'y a pas de contrainte on préférera créer une nouvelle liste et la retourner (éviter les effets de bord).

    Et ça se fait même en 1 ligne avec les listes en compréhension:

    >>> liData = [2,-7,4,5,12,10,4,2,4,-18]
    >>> liData2 = [x for x in liData if x!=4]
    >>> liData2
    [2, -7, 5, 12, 10, 2, -18]

    Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN