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 :

Incompréhension méthode append [Python 3.X]


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2019
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2019
    Messages : 39
    Par défaut Incompréhension méthode append
    Bonjour cher forum,

    je débute en python, et pour m'entrainer, je fais les exercices proposés par checkio.

    voici ce que la définition doit faire (regrouper en sous-liste les éléments égaux consécutifs):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    group_equal([1, 1, 4, 4, 4, "hello", "hello", 4]) == [[1,1],[4,4,4],["hello","hello"],[4]]
     
    group_equal([1, 2, 3, 4]) == [[1], [2], [3], [4]]
     
    group_equal([1]) == [[1]]
     
    group_equal([]) == []
    Mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    def group_equal(els):
     
        tab = []
        tab_final = []
        a = els[0]
     
        for i in els:
            if i == a:
                tab.append(i)
     
            else:
                tab_final.append(tab)
                tab.clear()
                tab.append(i)
                a = i
     
        return tab_final
     
     
    if __name__ == '__main__':
        print("Example:")
        print(group_equal([1, 1, 4, 4, 4, "hello", "hello", 4]))
    C'est sans doute pas le meilleur loin de là, j'en suis bien conscient

    Je ne comprends pas le résultat que j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Example:
    [[4], [4], [4]]
    Pourquoi ma méthode .append n'ajoute pas correctement la liste tab à tab_final... Je cherche depuis des heures et ne trouve pas...
    Je sais par ailleur qu'il me manque la dernière boucle, mais ca je pense pouvoir me débrouiller pour trouver une solution.

    Une ame charitable pour m'éclaircir?
    Merci beaucoup

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 828
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 828
    Billets dans le blog
    1
    Par défaut
    Bonjour à toi
    Citation Envoyé par Niko21 Voir le message
    je débute en python, et pour m'entrainer, je fais les exercices proposés par checkio.
    C'est la meilleure façon qui soit pour progresser

    Citation Envoyé par Niko21 Voir le message
    C'est sans doute pas le meilleur loin de là, j'en suis bien conscient
    Pour l'instant ce n'est pas important et ça viendra tout seul (l'ignorance est de courte durée, la connaissance reste à vie)

    Citation Envoyé par Niko21 Voir le message
    Pourquoi ma méthode .append n'ajoute pas correctement la liste tab à tab_final... Je cherche depuis des heures et ne trouve pas...
    En fait tu te fais piéger par le fait que tu ne copies que la "référence" de "tab". Et quand tu vides "tab", ce que tu as copié dans "tab_final" référence alors un tableau vide. C'est un piège dans lequel tombent tous les débutants quand ils copient un tableau.
    Remplace tab_final.append(tab) par tab_final.append(list(tab)). Tu copieras alors dans "tab_final" une copie à chaud de "tab" et non "tab" lui-même.

    Citation Envoyé par Niko21 Voir le message
    Je sais par ailleur qu'il me manque la dernière boucle, mais ca je pense pouvoir me débrouiller pour trouver une solution.
    Mauvaise approche. Il n'y a pas de raison de traiter le dernier cas de façon différente des autres cas. Un bon algorithme devrait tout traiter dans une même boucle.
    Je comprends bien que tu as un souci avec le dernier élément puisque quand tu le traites tu ne sais pas encore qu'il est le dernier et donc tu ne sais pas encore qu'il faudra le rajouter à "tab_final". Mais rien ne t'empêche de traiter une liste "artificiellement" transformée pour que le dernier élément ne soit alors plus le dernier. Par exemple tu peux remplacer ton for i in els par un for i in tuple(els) + (None,). Ainsi le dernier élément de ta "vraie" liste ne sera plus le dernier de ton algo et sera alors traité comme les autres...

    Attention aussi car en commençant par mémoriser "els[0]" dans "a" puis en commençant ta boucle à "els" et en testant i == a tu compareras alors "els[0]" avec "els[0]" ce qui sera fatalement égal. Essaye plutôt de réduire le nombre de variables (ce qui réduira alors le nombre de bug potentiels) et pense à utiliser "tab[-1]" qui référence le dernier élément de "tab"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Bonsoir

    Vous n'êtes pas loin, il suffit de remplacer

    par :

    En faite quand vous ajouter un élément à une liste (à tab_final), si c'est un élément mutable (comme une liste, que je vais appelé une sous-liste) alors python n'ajoutes pas la sous-liste à proprement parler à la liste. Python est fainéant, et il ajoute à la liste seulement une référence (un lien) qui pointe vers la sous-liste. Donc si vous modifiez votre sous-liste, python ayant toujours un lien de la liste vers la sous liste, et bien ce qui se trouve dans votre liste s'en trouve impacté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    a=[[1,2]]
    b=[a,a]
    print(b)
    a=[3]
    print(b)
    Si vous faites un sousliste.clear(), vous effacer son contenu, mais vous garder la même sous-liste.
    Si vous faites un sousliste=[], vous initialisez une nouvelle sousliste.

    Une autre facon de corriger le problème serait d'utiliser copy. C'est à dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab_final.append(copy.copy(tab))
    et là vous forcez python à faire une copie, et pas juste le fainéant avec juste un lien.

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2019
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2019
    Messages : 39
    Par défaut
    Et bien merci beaucoup!

    Réponses sympathiques, claires et instructives. J'ai passé un bout de temps à chercher sur les différents tutos, sans trouver ces explications, j'essaierai de ne plus tomber dans le piège. Et merci pour le bonus sur la boucle.


    Messieurs je vous salue bien bas

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

Discussions similaires

  1. [Python 3.5.1] Bug ou incompréhension avec append()
    Par funestra dans le forum Général Python
    Réponses: 7
    Dernier message: 05/04/2016, 22h27
  2. Réponses: 5
    Dernier message: 22/10/2014, 08h22
  3. Exécution unique avec la méthode append
    Par skawll dans le forum jQuery
    Réponses: 1
    Dernier message: 04/01/2014, 20h29
  4. utilisation la méthode Append d'une memo
    Par farid0031 dans le forum C++Builder
    Réponses: 1
    Dernier message: 15/05/2009, 21h56
  5. méthode getDocument() incompréhensible
    Par Nayila dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 03/03/2008, 23h02

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