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 :

Trier && Fusionner deux listes


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Septembre 2009
    Messages
    458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Septembre 2009
    Messages : 458
    Par défaut Trier && Fusionner deux listes
    Bonsoir,

    J'aimerais bien apprendre à trier et à fusionner deux listes avez-vous une idée de la façon qu'il faut procéder ?

    Je pense avoir réussi du côté du triage, mais je galère avec la fusion.

    Le but est de trier ces deux listes :

    tableau1 = [4,6,8,2]
    tableau2 = [3,1,5,7]

    puis de créer un troisième tableau qui reprend tout (trié)

    Je parviens à trier mais j'ai un soucis au niveau de la fusion. Si vous pouvez m'aider je vous en serais infiniment reconnaissant.

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    def tris(tab):
        for i in range(len(tab)):
            for j in range(len(tab) - 1):
                if tab[ j + 1 ] < tab[ j ]:
                    unautre = tab[ j ]
                    tab[ j ] = tab[ j + 1 ]
                    tab[ j + 1 ] = unautre
        return tab
     
    def fusion():
        tab3 = []
        for i in range(len(tableau1)):
            for j in range(len(tableau2)):
                if tableau1[i] < tableau2[j]:
                    tab3.append(tableau1[i])
     
     
                else:
                    tab3.append(tableau2[j])
     
        tris(tab3)
        return tab3
     
     
    tableau1 = [4,6,8,2]
    tableau2 = [3,1,5,7]
     
    print(fusion())
     
    #print(tris( tableau1))
    #print(tris( tableau2))

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Par défaut
    Bonsoir,

    je suppose que votre exercice est d'apprendre la manipulation des tableaux ?
    Parce qu'en langage haut niveau il a y tellement plus simple, même en C++ (bas niveau) je pense qu'il n'est pas nécessaire de réinventer la roue, alors imaginez ce que ça donne en Python :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tableau1 = [4,6,8,2]
    tableau2 = [3,1,5,7]
    tableau_fusion = sorted(tableau1 + tableau2)
    print(tableau_fusion) # [1, 2, 3, 4, 5, 6, 7, 8]
    https://wiki.python.org/moin/HowTo/Sorting

    Mais pour répondre à votre question.

    Premier constat c'est l'appel de variables globales dans vos fonctions, c'est certes bien pratique à utiliser mais c'est aussi une mauvaise habitude qu'il vaut mieux éviter si vous souhaitez écrire un code important.


    Il faut aussi prendre conscience que le passage en paramètre d'une liste va être un passage par référence et non par valeur.

    Si on fait passer un objet mutable en paramètre d'une fonction et qu'elle modifie le contenu de l'objet, cela modifiera aussi le contenu de l'objet d'origine passé en paramètre. On parle ici d'un passage par référence.

    Objets dits mutable en Python : Les listes et bytes.

    Si on fait passer un objet immutable en paramètre et que la fonction modifie la valeur elle ne sera modifiée qu'en local et ne va pas modifier l'objet passé en argument. On parle ici d'un passage par valeur.

    Objets dits immutable / immuable en Python : Les nombres (int, float, ..), le texte (str), les tuples

    developpez.net/post8486205


    Lors de l'appel de la fonction tris(tableau2) ça modifie le contenu de tableau2.

    Pour éviter cela il faut copier le contenu dans une autre variable que l'on peut ensuite modifier sans risque.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def tris(tab_ref):
       tab = tab_ref[:] # Copie du contenu dans une variable locale
    ...
    Pour en savoir plus sur les types : https://docs.python.org/3.4/library/stdtypes.html

    Dans la fonction fusion le mieux serait de fusionner puis de trier le tout, pourquoi vouloir trier avant pour re-trier ensuite ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def fusion(tab1, tab2):
        tab3 = tab1 + tab2
        return tris(tab3)

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,
    Citation Envoyé par Tamzoro Voir le message
    Je parviens à trier mais j'ai un soucis au niveau de la fusion. Si vous pouvez m'aider je vous en serais infiniment reconnaissant.
    Relisez votre code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def fusion():
        tab3 = []
        for i in range(len(tableau1)):
            for j in range(len(tableau2)):
                if tableau1[i] < tableau2[j]:
                    tab3.append(tableau1[i])
     
     
                else:
                    tab3.append(tableau2[j])
     
        tris(tab3)
        return tab3
    Si vous voulez ajouter vos listes pour trier la liste résultante (tab3) quel est l'intérêt de vos boucles imbriquées? Autant écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def fusion():
         return tris(tableau1 + tableau2)
    Là ou l'exercice deviendrait intéressant (pour jouer avec les indices) est de faire que fusion fabrique une liste triée lorsqu'on lui passe des listes triées en paramètres...
    Dans ce cas, on va bien avoir à faire une comparaison "tableau1[i] < tableau2[j]" mais si on ajoute le plus petit à tab3, il faudra incrémenter i ou j suivant sa liste d'origine. Donc on a plutôt envie d'écrire un truc genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            if tableau1[i] < tableau2[j]:
                tab3.append(tableau1[i])
                i += 1
            else:
                tab3.append(tableau2[j])
                j += 1
    dans une boucle while ou la condition de sortie sera "tant qu'on n'est pas à la fin d'une des deux listes...". A la sortie, il faudra ajouter les éléments de la liste restante.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre éclairé
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Septembre 2009
    Messages
    458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Septembre 2009
    Messages : 458
    Par défaut
    Bonsoir à vous,

    Je vous remercie pour votre aide.
    @YCL-1: merci pour vos explications, effectivement le but est d'apprendre à manipuler des tableaux... Je rencontre toujours des difficulté à fusionner mes deux tableaux.
    wiztricks: merci également pour votre aide, J'aimerais essayer de fusionner mes deux tableaux avec une boucle WHILE mais j'ai un petit beug...

    Que pensez-vous de 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    def fusion():
        tableau1 = [1,3,5,2]
        tableau2 = [4,6,8,7]
        tableau3 = []
        i = 0
        j = 0
     
        while i < (len(tableau1)) and j < (len(tableau2)):
            if tableau1[i] < tableau2[j]:
                tableau3.append(tableau1[i])
                i += 1 
     
            else:
                tableau3.append(tableau2[j])
                j += 1
                if j == (len(tableau2)):
                    print(tableau3)
     
     
     
        return tris(tableau3)    
     
     
    def tris(tab):
        for i in range(len(tab)):
            for j in range(len(tab) - 1):
                if tab[ j + 1 ] < tab[ j ]:
                    unautre = tab[ j ]
                    tab[ j ] = tab[ j + 1 ]
                    tab[ j + 1 ] = unautre
        return tab
     
     
    print(fusion())

  5. #5
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Placez :
    au début de votre deuxième fonction, vous comprendrez peut-être ce qui se passe.
    En général, usez et abusez des "print"

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par Tamzoro Voir le message
    Que pensez-vous de mon code ?
    Ben, essayez de vous relire:


    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    def fusion():
        tableau1 = [1,3,5,2]
        tableau2 = [4,6,8,7]
        tableau3 = []
        i = 0
        j = 0
     
        while i < (len(tableau1)) and j < (len(tableau2)):
            if tableau1[i] < tableau2[j]:
                tableau3.append(tableau1[i])
                i += 1 
     
            else:
                tableau3.append(tableau2[j])
                j += 1
                if j == (len(tableau2)):
                    print(tableau3)
     
     
     
        return tris(tableau3)    
     
     
    def tris(tab):
        for i in range(len(tab)):
            for j in range(len(tab) - 1):
                if tab[ j + 1 ] < tab[ j ]:
                    unautre = tab[ j ]
                    tab[ j ] = tab[ j + 1 ]
                    tab[ j + 1 ] = unautre
        return tab
     
     
    print(fusion())
    moi, j'ai toujours les mêmes questions: si vous triez tableau3, pas la peine d'écrire une fonction "fusion" aussi compliquée, vous pouvez vous contenter de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def tris(tab):
        for i in range(len(tab)):
            for j in range(len(tab) - 1):
                if tab[ j + 1 ] < tab[ j ]:
                    unautre = tab[ j ]
                    tab[ j ] = tab[ j + 1 ]
                    tab[ j + 1 ] = unautre
        return tab
     
    tableau1 = [1,3,5,2]
    tableau2 = [4,6,8,7]    
    print(tris(tableau1 + tableau2))
    Par contre, si vous voulez écrire une fonction fusion (et donner du sens au while...), il faut partir de tableau1 et tableau2 triés et écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print(fusion(tris(tableau1), tris(tableau2)))
    Sans oublier que lorsque la condition i < (len(tableau1)) and j < (len(tableau2)) devient fausse, seule une des deux listes aura été parcourue: il faut faire quelque chose pour ajouter les éléments restants de l'autre liste.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Fusionner Deux Listes
    Par Meliodas09 dans le forum Prolog
    Réponses: 2
    Dernier message: 14/01/2016, 19h01
  2. [Excel] Fusionner deux LISTES avec Intersection
    Par courriervirtuel dans le forum Excel
    Réponses: 3
    Dernier message: 17/09/2011, 19h44
  3. [Debutant] [JTable] Fusionner deux cellules
    Par devil26 dans le forum Composants
    Réponses: 4
    Dernier message: 03/05/2005, 13h39
  4. [TreeMap] comparer et fusionner deux TreeMap
    Par LoLoSS dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 06/09/2004, 11h49

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