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 :

Meilleure méthode pour comparer 2 grandes listes


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Points : 25
    Points
    25
    Par défaut Meilleure méthode pour comparer 2 grandes listes
    Bonjour à tous !

    Je suis à la recherche d'une méthode efficace permettant de comparer deux listes, c'est-à-dire récupérer la liste des éléments présents uniquement dans la première liste, puis celle des éléments présents uniquement dans la seconde liste.

    Actuellement, je fais :
    list1 = [x for x in Y if x not in Z]
    list2 = [x for x in Z if x not in Y]

    Le problème est que mes listes contiennent environ 200 000 éléments chacune (et ça va augmenter dans l'avenir), et donc, le temps de calcul est trèèès long......

    Je recherche donc une méthode (algorithme, module, ...) qui permette de faire mieux que ce simple code, mais qui donne le même résultat !

    Je travaille avec Python 2.5.4 (pas de possibilité d'utiliser une version supérieure).

    Merci d'avance !

  2. #2
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    bonjour,

    Essaye en utilisant les set:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> r1 = range(1, 150, 3)
    >>> r2 = range(12, 64, 13)
    >>> r1, r2= set(r1), set(r2)
    >>> r1.intersection(r2)
    set([25])
    >>> r1.difference(r2)
    set([1, 130, 4, 133, 7, 136, 10, 139, 13, 142, 16, 145, 19, 148, 22, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82, 85, 88, 91, 94, 97, 100, 103, 106, 109, 112, 115, 118, 121, 124, 127])
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 53
    Points : 64
    Points
    64
    Par défaut
    Depuis Python 2.4, le type set est dans les structures 'built-in'. Rien à importer.

    Je crois qu'une solution est de combiner quelques unes des fonctions d'ensembles disponibles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ensembleY = set(Y)
    ensembleZ = set(Z)
     
    Liste1 = list(ensembleY.difference(ensembleZ)) # ou list(... - ...)
    Liste2 = list(ensembleZ - ensembleY)
    ATTENTION: si les listes contiennent plusieurs fois le même element, alors les doublons disparaitront. (logique pour un ensemble.)

    REMARQUE: Tu vas créer des ensembles ensembleY, ensembleZ, mais les il me semble que tu vas y gagner en temps par rapport à la création de listes. A tester!

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    J'imagine que tu voulais écrire "x not in Z" et pas "gene not in Z" ?

    Essaie comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sY = set(Y)
    sZ = set(Z)
    list1 = [x for x in Y if x not in sZ]
    list2 = [x for x in Z if x not in sY]
    Si l'ordre n'est pas important et qu'il n'y a pas de doublons (ou que tu peux te permettre de les éliminer), tu peux utiliser l'opération différence sur les ensembles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set1 = sY - sZ
    set2 = sZ - sY
    list1,list2 = list(set1),list(set2)   #si vraiment nécessaire
    Si après tu fais l'union des éléments trouvés, autant calculer la différence symétrique:
    Plus d'infos: http://docs.python.org/library/stdty...-set-frozenset

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Points : 25
    Points
    25
    Par défaut
    Waow ! Merci à tous, ça marche super bien !

    Ce qui prenait plusieurs heures avec les list, prend maintenant 5 secondes avec les set !!!
    Extraordinaire !

    Je crois que je vais me pencher davantage sur les set, que je connais finalement très peu....

    Pour info, j'ai utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set1 = sY - sZ
    set2 = sZ - sY
    list1,list2 = list(set1),list(set2)
    Encore merci, j'en reviens pas !

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

Discussions similaires

  1. [2000] Meilleure méthode pour insérer un grand nombre de lignes
    Par nicodev24 dans le forum Développement
    Réponses: 11
    Dernier message: 31/10/2016, 11h25
  2. Meilleure méthode pour remplir une liste
    Par kodo dans le forum Général Java
    Réponses: 4
    Dernier message: 15/05/2012, 12h06
  3. [PHP Excel] Meilleure méthode pour créer un grand nombre de feuille ?
    Par sunshine33 dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 16/04/2010, 10h07
  4. Meilleur méthode pour gérer une liste des blocks
    Par smyley dans le forum Algorithmes et structures de données
    Réponses: 41
    Dernier message: 22/07/2008, 02h06
  5. Réponses: 3
    Dernier message: 24/06/2004, 11h23

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