IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Python Discussion :

[Python 3.3.5] Problème de remise à zéro d'une liste


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Par défaut [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
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    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 !

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    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

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Par défaut
    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
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    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

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    est équivalent à

    le else, ne sert à rien dans ton code.

    C'est des remarques complémentaires à celles de plxpy.

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Par défaut
    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
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Si remise_a_zero est une fonction qui retourne la liste telle que tu la souhaites, tu dois faire :

    Tout simplement.

    Tout passage par une variable intermédiaire (le 'B' de la dernière version) est inutile et n'y changera rien.

  9. #9
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Par défaut
    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
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Par défaut
    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 !

  11. #11
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    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.

  12. #12
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Par défaut
    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

  13. #13
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    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

  14. #14
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    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.

  15. #15
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remise à zéro d'une table sur X3
    Par dysymouha dans le forum SAGE
    Réponses: 0
    Dernier message: 13/10/2014, 17h27
  2. [Struts 1] Remise à zéro d'une valeur String
    Par Linio dans le forum Struts 1
    Réponses: 5
    Dernier message: 19/07/2011, 21h26
  3. Réponses: 9
    Dernier message: 11/05/2011, 15h15
  4. [XL-2003] Remise à zéro d'une cellule
    Par niobium dans le forum Excel
    Réponses: 2
    Dernier message: 08/02/2010, 15h52
  5. Remise à zéro d'une commande
    Par Clint Southwood dans le forum LabVIEW
    Réponses: 2
    Dernier message: 13/12/2007, 18h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo