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

  1. #1
    Candidat au Club
    [Python 3.3.5] Problème de remise à zéro d'une liste
    Bonjour.

    Je débute en python et j'ai un petit problème concernant un programme qui me semblait pourtant simple.
    Je dois définir une fonction permettant la remise à 0 de toutes les valeurs d'une liste lorsque celles ci sont égales à 1.
    Par exemple, si ma liste L est [1,1,1,1,1], la fonction doit faire en sorte que L=[0,0,0,0,0] .

    J'ai essayé ceci :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    A=[1,1,1,1,1]
     
    def remise_a_zero(A):
        if A == [1 for i in A]:
             A = [0 for i in A]
        else:
            pass
        return A
     
    A


    Lors du "return A", j'ai bien une liste ne comportant que des 0 mais si je demande ensuite la liste A, j'obtiens A=[1,1,1,1,1].

    Pouvez-vous m'indiquer ce qui ne fonctionne pas ? J'avoue que je suis totalement perdu...

  2. #2
    Modérateur

    Salut

    Attention à la balise code !

    Sinon, tu n'appelles jamais ta fonction. Donc, quand A s'affiche, elle est comme tu l'as initialisée !
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  3. #3
    Expert confirmé
    Sinon il y a une fonction all qui fait cela.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    >>> A = [1, 1, 1, 1, 1]
    >>> all(A)
    True
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  4. #4
    Candidat au Club
    Oup's, j'ai en effet oublié une partie de mon code dans le sujet.

    Apres avoir défini ma fonction, je l'appelle et elle me répond [0,0,0,0,0] mais lorsque ensuite je demande A, j'obtiens toujours A=[1,1,1,1,1].

    Voilà donc le code complété :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    A=[1,1,1,1,1]
     
    def remise_a_zero(A):
     
        if all(A)==1 : 
             A = [0 for i in A]
        else:
            pass
        return A
     
    remise_a_zero(A)
    A

  5. #5
    Modérateur

    Ta fonction est construite pour, dans tous les cas, retourner une liste : une nouvelle liste (partie if) ou la même (partie else).

    Si tu ne la récupères pas (avec une affectation), elle tombe dans un puits sans fond ... et la liste A d'origine reste inchangée
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  6. #6
    Expert confirmé
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    if all(A)==1 :


    est équivalent à

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    if all(A):


    le else, ne sert à rien dans ton code.

    C'est des remarques complémentaires à celles de plxpy.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Candidat au Club
    J'ai le sentiment que le courant ne passe pas entre Python et moi...
    J'ai essayé d'appliquer vos remarques mais visiblement quelque chose m'échappe encore.
    Il me semble que le problème porte toujours sur l'affectation de la liste créée par ma fonction, liste que je n'arrive pas à récupérer.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    A=[1,1,1,1,1]
     
    def remise_a_zero(A):
     
        if all(A):
             B = [0 for i in A]     
             A = B
        return A
     
    remise_a_zero(A)
    A

  8. #8
    Modérateur

    Si remise_a_zero est une fonction qui retourne la liste telle que tu la souhaites, tu dois faire :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    A = remise_a_zero(A)


    Tout simplement.

    Tout passage par une variable intermédiaire (le 'B' de la dernière version) est inutile et n'y changera rien.
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  9. #9
    Candidat au Club
    Ah d'accord, en effet ça marche beaucoup mieux, merci beaucoup !
    Par contre, il n'y a pas moyen de faire en sorte que la liste A se remette à zéro en appelant simplement la fonction remise_a_zero(A) , sans affectation ?

  10. #10
    Modérateur

    Si c'est possible parce que les listes sont des objets mutables mais il faut la mettre à jour, ce qui exclut une affectation comme tu le faisais.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def remise_a_zero(A):
        if all(A):
            for i in range(len(A)):
                A[i] = 0


    Sinon je ne suis pas sur que all(A) soit ce que tu veux vraiment.
    all([1, 0]) est faux et la liste ne sera pas modifiée
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  11. #11
    Candidat au Club
    C'est bon, j'ai réussi à faire en sorte que l'appel de la fonction remise_a_zero suffise à remettre à 0 l'ensemble des valeurs de A.
    Le code doit certainement être simplifiable, mais je suis déjà content d'avoir réussi à le terminer.
    (au passage, je viens de me rendre compte que ma fonction ne devait pas juste remettre la liste à zéro lorsque qu'elle ne contient que des 1 mais plus généralement lorsque qu'elle ne contient pas que des 0. J'ai fait la modification en conséquence).

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    A=[1,3,7,123,5]
     
    def remise_a_zero(A):
        if all(A)==0:
            pass
        else:
            for i in range(len(A)):
                A[i]=0
        return A
     
    remise_a_zero(A)
    A


    Merci beaucoup à tous les deux, vous m'avez été d'une grande aide !

  12. #12
    Modérateur

    Citation Envoyé par rom2708 Voir le message
    au passage, je viens de me rendre compte que ma fonction ne devait pas juste remettre la liste à zéro lorsque qu'elle ne contient que des 1 mais plus généralement lorsque qu'elle ne contient pas que des 0
    je m'en doutais (cf remarque ...)

    C'est plutôt any qu'il faut utiliser, et pas all (pas une simple substitution !)

    Ca simplifiera ton code.
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  13. #13
    Candidat au Club
    Oui, j'ai écrit le message pendant que vous répondiez donc je n'avais pas vu votre réponse avant de poster la mienne.
    Je ne connaissais pas les fonctions all et any mais elles correspondent parfaitement à ce problème.

    Si j'ai bien compris, le code devient :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    A=[2,3,7,123,5]
     
    def remise_a_zero(A):
        if any(A):
            for i in range(len(A)):
                A[i]=0
        return A
     
    remise_a_zero(A);A

  14. #14
    Modérateur

    Ah ben non ! Si tu choisis de faire une mise à jour, le "return A" n'a plus de sens. L'interpréteur ne couine pas mais ce n'est pas (très) logique de retourner quelque chose.
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  15. #15
    Candidat au Club
    En effet ce n'est pas réellement nécessaire mais je l'ai laissé car on me demande de retourner la liste remise à zero dans mon énoncé.
    En dehors de ça, je suis tout à fait d'accord que l'utilisation du "return A" n'est pas logique.