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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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
    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
    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 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
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    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
    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
    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
    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
    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
    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 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

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