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
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
Ben, une fois que tu as ta liste d’éléments à exclure*:
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
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]
Voilà déjà quelques éléments de réponse, s’ils ne te suffisent pas, essaye de préciser un peu ta question…
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']
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
Gne*?
Je ne comprends pas ce que tu veux dire… Explique ou donne un exemple, s’il te plais…![]()
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
Dans ce cas, c’est très simple (quoi que plus verbeux) –*Python dispose d’une fonctionnalité de test de sous chaînes*:
[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
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']
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…
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']
Partager