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 :

soustraire chaque occurance d'une liste d'une seconde liste


Sujet :

Python

  1. #1
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut soustraire chaque occurance d'une liste d'une seconde liste
    Hello,
    Voilà, je dispose de deux listes, base et fake.
    j'aimerai delete de la liste base tous les éléments de la liste fake. (il est possible que les éléments de fake ne soit pas dans base).
    Il est certains que je pourrais boucler toussa mais je suis étonné chaque jour de la bibliothèque de python et j'aimerai savoir si une fonction existe (ou si la surcharge des opérateurs pourrais directement soustraire deux listes (j'ai le droit de rever )

    bonne journée
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  2. #2
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Salut

    Le plus simple auquel je pense dans l'immédiat est ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    In [49]: a = [1, 2, 3]
     
    In [50]: b = [3, 4, 5]
     
    In [51]: filter(lambda x: x not in b, a)
    Out[51]: [1, 2]
    Plus d'info sur les fonctions lambda ? http://docs.python.org/tutorial/cont...1#lambda-forms

    Il est possible de réassigner __builtins__.list aussi:
    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
    In [56]: class MyList(list):
       ....:     def __sub__(self, other):
       ....:         return filter(lambda x: x not in other, self)
       ....:
       ....:
     
    In [57]: __builtins__.list = MyList
     
    In [58]: [].__class__ # Ce serait trop beau, mais non :p
    Out[58]: <type 'list'>
     
    In [59]: list() # Ca par contre, c'est bon
    Out[59]: []
     
    In [60]: list().__class__
    Out[60]: <class '__main__.MyList'>

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Puisque ce genre de manipulation de liste est déjà prévu dans le type ensemble (set):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    base = ['x2','x1','x5','x4','x3']
    fake = ['x3','x5']
     
    print list(set(base)-set(fake))
    ['x2', 'x1', 'x4']
    Je ne sais pas ce que le changement de type coûte en temps d'exécution, mais il est difficile de faire plus simple .

    Tyrtamos

    edit: pour répondre complètement au problème posé: il peut y avoir dans fake des éléments qui ne se trouvent pas dans base, ce qui, bien entendu, ne change pas le résultat.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    merci beaucoup, python est décidément bien pratique (remplacer une fonction de 10 lignes par une seule ligne ca le fait bien )
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  5. #5
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Deux problèmes , éventuellement, avec la solution passant par set:
    - l’ordre n’est pas conservé
    - si plusieurs éléments sont identiques dans la liste base, set(base) les réduit à un seul. Si ce sont des éléments non éliminables, il n’en reste plus qu’un après traitement.

    Si ces deux points importent alors il vaut mieux faire tout simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    base = [2,4,3,467,4,6,8,74,87,45,6,75,6,45,6,509,34,3,2,509,4]
    fake = [4,45]
     
    print 'base    =',base
    print 'fake    =',fake
    print 'reduite =',[x  for x in base if x not in fake]
    base = [2, 4, 3, 467, 4, 6, 8, 74, 87, 45, 6, 75, 6, 45, 6, 509, 34, 3, 2, 509, 4]
    fake = [4, 45]
    reduite = [2, 3, 467, 6, 8, 74, 87, 6, 75, 6, 6, 509, 34, 3, 2, 509]

    Sinon avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    base = [2,4,3,467,4,6,8,74,87,45,6,75,6,45,6,509,34,3,2,509,4]
    fake = [4,45]
     
    print 'base    =',base
    print 'fake    =',fake
    print '         ',list((set(base)-set(fake)))
    base = [2, 4, 3, 467, 4, 6, 8, 74, 87, 45, 6, 75, 6, 45, 6, 509, 34, 3, 2, 509, 4]
    fake = [4, 45]
    [2, 3, 6, 8, 74, 75, 34, 467, 87, 509]

  6. #6
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Hello,
    merci de ta reponse, non pertinante pour mon cas mais interressante quand meme (j'y aurais pense qu'en cherchant pendant 1/2h un bug )
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  2. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  3. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  4. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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