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 :

comparaison de deux listes d'objets


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut comparaison de deux listes d'objets
    Bonjour,

    J'ai une class avec plusieurs arguments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Personne:	  
        nom = ""
        emplacement = "" 
        profession =""
        ...
    Avec cette class je forme deux listes de personnes, une de référence et une deuxième qui représente l'état actuel.
    je voudrais comparer les deux et ranger les nouvelles personnes dans nouvelle liste spécifique, celle qui ont changer de profession dans une autre liste spécifique et ainsi de suite. Afin d'avoir en résultat toutes les modifications.

    Les deux listes sont assez longue (=~3000 entrées) et je n'arrive pas à le faire de façon optimiser.

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par alextremiter Voir le message
    Les deux listes sont assez longue (=~3000 entrées) et je n'arrive pas à le faire de façon optimiser.
    Pour ne pas comparer les ~3000 objets de la première liste aux ~3000 objets de la seconde, il faudrait ranger la liste de référence dans un dictionnaire dont la clé pourrait être le nom (ou une combinaison d'attributs qui ne changent pas pour une même personne mais qui soient différents pour chaque personne).

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

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    En même temps que wiztricks répondait, j'écrivais un code à base de... dictionnaires

    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
    36
    37
    38
    39
    40
    41
    class Personne:
        def __init__(self, nom, profession, emplacement):
            self.nom = nom
            self.profession = profession
            self.emplacement = emplacement
     
        def __repr__(self, *args, **kwargs):
            return self.nom + self.profession + self.emplacement
     
     
    reference = [Personne("paul", "plombier", "nantes"),
                 Personne("max", "commercial", "lyon"),
                 Personne("jeanne", "coo", "marseille")]
     
    actuel = [Personne("paul", "plombier", "nantes"),
                 Personne("max", "marketing", "lyon"),
                 Personne("jeanne", "coo", "aix")]
     
    print(reference)
    print(actuel)
     
    # Creation de dictionnaires
    reference_dict = dict()
    for personne in reference:
        reference_dict[personne.nom] = personne
     
    actuel_dict = dict()
    for personne in actuel:
        actuel_dict[personne.nom] = personne
     
     
    print(reference_dict)
    print(actuel_dict)
     
    # Ceux qui ont demenage
    demenages = list()
    for key in reference_dict.keys():
        if reference_dict[key].emplacement != actuel_dict[key].emplacement:
            demenages.append(personne)
     
    print(demenages)

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Bktero Voir le message
    En même temps que wiztricks répondait, j'écrivais un code à base de... dictionnaires
    Quitte à poster du code, avec Python, on pourrait faire cela ainsi:

    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
    from collections import namedtuple
     
    class Personne(namedtuple('personne', 'nom profession adresse')):
        def __hash__(self):
            return hash (self.nom)
        def __eq__(self, other):
            return self.nom == other.nom
     
    if __name__ == '__main__':
     
        REF_DATA = [
            ("paul", "plombier", "nantes"),
            ("max", "commercial", "lyon"),
            ("jeanne", "coo", "marseille"),
            ]
     
        ACTUAL_DATA = [
            ("paul", "plombier", "nantes"),
            ("max", "marketing", "lyon"),
            ("jeanne", "coo", "aix"),
            ]
     
        reference = {}
        for item in REF_DATA:
            p = Personne(*item)
            reference[p] = p
     
        for item in ACTUAL_DATA:
            p = Personne(*item)
            r = reference.get(p)
            if r and r.adresse != p.adresse:
                print (p.nom)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour et merci pour vos réponse,

    Le problème que j'ai c'est que s'il y a une nouvelle personne ou s'il en manque une entre la liste de référence et actuelle, il n'est plus possible de parcourir les listes/dictionnaires de cette façon.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par alextremiter Voir le message
    Le problème que j'ai c'est que s'il y a une nouvelle personne ou s'il en manque une entre la liste de référence et actuelle, il n'est plus possible de parcourir les listes/dictionnaires de cette façon.
    Si les deux listes sont à peu près identiques, vous pourriez les ranger suivant la clef et les comparer en utilisant 2 index pour détecter ajouts et suppressions.
    Une autre façon de faire pourrait être de travailler sur des ensembles (vous avez des "set" en Python) i.e. soit des ensembles construits à partir des clefs, soit des ensembles construits avec ma classe Personne (car il faut définir une fonction __hash__ pour définir l'identité entre deux instances de classes utilisateurs) et faire des opération de "soustraction" d'ensembles.

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

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour votre aide, j'ai pu avancer beaucoup plus rapidement.

    voici le code final pour cette partie:
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
     
    #python
     
    from collections import namedtuple
     
    class Personne(namedtuple('personne', 'nom profession adresse enfant')):
        def __hash__(self):
            return hash (self.nom)
        def __eq__(self, other):
            return self.nom == other.nom        
     
    class Enfant(namedtuple('enfant', 'nom ecole sport')):
        def __hash__(self):
            return hash (self.nom)
        def __eq__(self, other):
            return self.nom == other.nom
     
    if __name__ == '__main__':
     
        REF_DATA_E1 = [
            ("pauline", "term", "foot"),
            ("max", "cm2", ""),
            ("jeanne", "6", "tennis"),
            ]
     
        ACTUAL_DATA_E1 = [
            ("lucie", "", ""),
            ("max", "cm2", "danse"),
            ("jeanne", "5", "tennis"),     
            ]          
     
     
        reference_E1 = {}
        for item in REF_DATA_E1:
            p = Enfant(*item)
            reference_E1[p] = p         
     
        actuel_E1 = {}    
        for item in ACTUAL_DATA_E1:
            p = Enfant(*item)
            actuel_E1[p] = p
     
        REF_DATA = [
            ("paul", "plombier", "nantes", reference_E1),
            ("max", "commercial", "lyon", []),
            ("jeanne", "coo", "marseille", []),
            ("lilian", "CM", "lile", []),
            ("seb", "CM", "lile", []),
            ("maxime", "commercial", "lyon", []),
            ("maxime2", "commercial", "lyon", []),
            ]
     
        ACTUAL_DATA = [
            ("seb", "CM", "paris", []),
            ("maxime", "ouvrier", "lyon", []),
            ("pauline", "", "nantes", []),
            ("paul", "plombier", "nantes", actuel_E1),
            ("max", "marketing", "lyon", []),
            ("jeanne", "coo", "aix", []),
            ("francis", "elec", "paris", []),
            ("jerem", "elec", "paris", []),
            ("jerem2", "elec", "paris", []),
            ]
     
     
     
        reference = {}
        for item in REF_DATA:
            p = Personne(*item)
            reference[p] = p
     
     
        actuel = {}    
        for item in ACTUAL_DATA:
            p = Personne(*item)
            actuel[p] = p
     
     
        sY = set(reference)
        sZ = set(actuel)
     
        set1 = sZ - sY  
        set2 = sY - sZ
     
        list1 = list(set1)
        list2 = list(set2)
     
        print("nouvelles personnes :")
        for P in list1:
            print(str(P.nom))
            del actuel[P]
        print("\n")   
     
        print("personnes parties :") 
        for P in list2:
            print(str(P.nom)) 
            del reference[P]
        print("\n")     
     
        dem = []
        job = []
     
        nouvelle_Enfant = []
        enfant_Devenu_Adulte = []
     
        classe = []
        sport = []
     
        for p in actuel:
            r = reference.get(p)
            if r and r.adresse != p.adresse:
                dem.append(p)
            if r and r.profession != p.profession:
                job.append(p)
            if r and r.enfant != p.enfant:
     
                sYe = set(r.enfant)          
                sZe = set(p.enfant)
     
                set1e = sZe - sYe
                set2e = sYe - sZe
     
                list1e = list(set1e)
                list2e = list(set2e)
     
                for Re in list2e:    
                    enfant_Devenu_Adulte.append(str(Re.nom) + " pour " + str(r.nom))
                    del reference[r].enfant[Re]            
     
                for Pe in list1e:
                    nouvelle_Enfant.append(str(Pe.nom) + " pour " + str(p.nom))
                    del actuel[p].enfant[Pe]
     
                for enfant_A in p.enfant:
                    enfant_R = r.enfant.get(enfant_A)
                    if enfant_R and enfant_R.ecole != enfant_A.ecole:
                        classe.append(enfant_A)
                    if enfant_R and enfant_R.sport != enfant_A.sport:
                        sport.append(enfant_A)
     
     
     
     
        print("personnes qui ont déménagé :")
        for p in dem:
            print (p.nom)
        print("\n")    
     
        print("personnes qui ont changé de job :")
        for p in job:
            print (p.nom)
        print("\n") 
     
        print("nouveaux enfants :")
        for enf in nouvelle_Enfant:
            print (enf)
        print("\n") 
     
        print("enfants devenus adultes :")
        for enf in enfant_Devenu_Adulte:
            print (enf)
        print("\n") 
     
        print("enfants qui ont changé de classe :")
        for enf in classe:
            print (enf.nom)
        print("\n") 
     
        print("enfants qui changer de sport :")
        for enf in sport:
            print (enf.nom)
        print("\n")
    Merci encore

Discussions similaires

  1. comparaison de deux listes
    Par karaudrey88 dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2012, 14h04
  2. Comparaison de deux listes
    Par Isabella83 dans le forum Langage
    Réponses: 12
    Dernier message: 30/03/2012, 12h11
  3. [Débutant] Deux liste d'objets a mettre en relation
    Par bibyon dans le forum C#
    Réponses: 2
    Dernier message: 20/01/2012, 13h27
  4. Comparaison de deux listes de fichier
    Par jackiechen dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 07/01/2008, 16h28
  5. comparaison de deux séries d'objets
    Par Jasmine80 dans le forum Langage
    Réponses: 16
    Dernier message: 07/06/2007, 15h25

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