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 :

Filtrer une liste


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut Filtrer une liste
    Bonjour,

    J'aimerai savoir comment filtrer une liste à partir de 2 options:
    soit c'est l'utilisateur qui saisi les paramètres à supprimer d'une liste ou soit à partir d'une liste de paramètres en entrée

  2. #2
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Ben, une fois que tu as ta liste d’éléments à exclure*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def list_filter(lst, flt):
        flt = set(flt)  # Utiliser plutôt un set…
        # On retourne simplement une nouvelle liste contenant tous
        # les éléments de lst qui ne se trouvent pas dans flt…
        return [l for l in lst if l not in flt]
    Pour le reste, la question est un peu vague… Supposons simplement que ta liste d’éléments à exclure est au départ une string du type "el1, el2, el3", dans ce cas tu construis une vraie liste à partir ce ça grâce à split*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    usr_data = "el1, el2, el3"
    flt = usr_data.split(', ')  # Va retourner ['el1', 'el2', 'el3']
    Voilà déjà quelques éléments de réponse, s’ils ne te suffisent pas, essaye de préciser un peu ta question…

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut
    oui mais j'ai oublié de préciser que les paramètres sont des mots clés....c'est à dire filtrer si ce mot clé est présent dans le mot

  4. #4
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Gne*?

    Je ne comprends pas ce que tu veux dire… Explique ou donne un exemple, s’il te plais…

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut
    g par exemple la liste suivante:

    liste = ("cellule_asd_0","cellule_bfm_1","cellule_tf_2","cellule_ask_3","cellule_ijk_4")

    et j'ai envie de retirer la cellule avec _tf_ et _ijk_ par exemple

  6. #6
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Dans ce cas, c’est très simple (quoi que plus verbeux) –*Python dispose d’une fonctionnalité de test de sous chaînes*:

    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
    def apply_mask(lst, mask):
        ret = []
        for l in lst:
            valid = True
            for m in mask:
                if m in l:  # Si cet motif est une sous-chaîne de l’élément courant, on exclut ce dernier.
                    valid = False
                    break;
            if valid:
                ret.append(l)
        return ret
     
    lst = ("cellule_asd_0","cellule_bfm_1","cellule_tf_2","cellule_ask_3","cellule_ijk_4")
    mask = ("_tf_", "_ijk_")
     
    print(apply_mask(lst, mask))
    # ['cellule_asd_0', 'cellule_bfm_1', 'cellule_ask_3']
    [Edit] Pour le fun, il y a une formule en une seule ligne –*mais elle est peut-être moins facile à comprendre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def apply_mask(lst, mask):
        return [l for l in lst if not filter(lambda m: m in l, mask)]
     
    lst = ("cellule_asd_0","cellule_bfm_1","cellule_tf_2","cellule_ask_3","cellule_ijk_4")
    mask = ("_tf_", "_ijk_")
     
    print(apply_mask(lst, mask))
    # ['cellule_asd_0', 'cellule_bfm_1', 'cellule_ask_3']
    Mais cette version est moins rapide, car elle compare systématiquement tous les éléments du mask à chaque élément de la liste, alors que le premier code s’arrête dès qu’il a trouvé une correspondance…

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut
    et si je veux que se soit l'utilisateur qui rentre à la main ceux à filtrer je sais jamais si c'est raw_input() ou input() qu'il faut mettre

  8. #8
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    En python2, c’est raw_input() (car input() appelle implicitement eval() sur l’entrée utilisateur…).

    En python3, c’est input().

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut
    ok merci

  10. #10
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    @mont29
    L'opérateur - est surchargé dans les set pour implémenter le complémentaire.
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def list_filter(lst, flt):
        flt = set(flt)  # Utiliser plutôt un set…
        # On retourne simplement une nouvelle liste contenant tous
        # les éléments de lst qui ne se trouvent pas dans flt…
        return lst-flt
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  11. #11
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    @Zavonen*: certes, mais uniquement entre set, ça ne marche pas avec une liste (hélas…)*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> lst = [1,2,3,4,5,6,5,4,3,2,1]
    >>> msk = set((1,3,4))
    >>> lst - msk
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unsupported operand type(s) for -: 'list' and 'set'

  12. #12
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    voici deux solution 'inplace' (ie agit directement sur la liste passée en argument au lieu d'en retourner une nouvelle):

    • un façon apparemment adaptée à ton problème:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      >>> def inplace_filter2(lst, *forbiden):
      	for i in xrange(len(lst)-1,-1,-1):
      		key = lst[i]
      		if any(forbid in key for forbid in forbiden):
      			del lst[i]
       
       
      >>> l=['foo','foo_f_t_','fooooo','fooooo_f_t_']
      >>> inplace_filter2(l,'_f_','_t_')
      >>> l
      ['foo', 'fooooo']
    • une autre plus générale:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      >>> def inplace_filter(lst, func):
      	#func est une fonction devant retourner True pour effacemen ou False pour laisser
      	for i in xrange(len(lst)-1,-1,-1):
      		if func(lst[i]):
      			del lst[i]
       
       
      >>> l=['foo','foo_f_t_','fooooo','fooooo_f_t_']
      >>> inplace_filter(l,lambda x: '_f_t_' in x)
      >>> l
      ['foo', 'fooooo']

  13. #13
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    @Zavonen*: certes, mais uniquement entre set, ça ne marche pas avec une liste (hélas…)*:
    C'est logique à cause des occurrences multiples.
    Pour deux listes L1 et L2 le 'concept' L1-L2 n'est pas clair, pour des ensembles il n'y a aucune ambiguïté.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  14. #14
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Entre deux listes, je suis d’accord, mais je pensais au cas qui nous occupe ici, «*list - set*» –*là, la signification me semble des plus claire (enlever de la liste tous les éléments qui se trouvent dans l’ensemble), mais ça n’est pas implémenté, dommage…

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/05/2007, 11h23
  2. filtrer une liste en fonction d'une valeur
    Par robocop2776 dans le forum Access
    Réponses: 4
    Dernier message: 06/04/2007, 10h13
  3. Filtrer une liste déroulante
    Par Gone 23 dans le forum IHM
    Réponses: 7
    Dernier message: 20/03/2007, 14h06
  4. Filtrer une liste de classes
    Par neuromencien dans le forum Langage
    Réponses: 7
    Dernier message: 14/10/2006, 11h22
  5. Impossibilité de filtrer une liste déroulante
    Par lito74 dans le forum Access
    Réponses: 12
    Dernier message: 27/02/2006, 11h03

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