2010-01-07 6 views
1

Je ne ai probablement pas demandé correctement: Je voudrais une valeur de liste qui peut correspondre à une liste: le "inverse" de (None,) mais même avec (None,) il va correspondre élément comme Aucun (que je ne ' t veulent)Python liste qui correspond à tout

Le point est que j'ai une fonction de travail avec: [x for x in my_list if x[field] not in filter_list]

et je voudrais filtrer tout ou rien sans faire des tests comme: if filter_list==(None,): return [] et if filter_list==('*',): return my_list

PS: Je voulais simplifier mon q uestion conduisant à des erreurs (list identifiant) ou une chose stupide [x for x in x];)


Salut,

Je dois faire du filtrage avec la compréhension de la liste en python.

si je fais quelque chose comme ça:

[x for x in list if x in (None,)] 

je me débarrasser de toutes les valeurs, ce qui est bien

mais je voudrais avoir la même chose à tout correspondre

je peux faire quelque chose comme:

[x for x in list if x not in (None,)] 

mais il ne sera pas homogène avec le reste

J'ai essayé certaines choses, mais par exemple (True,) matchs seulement 1

Remarque que les valeurs de filtre sont numériques, mais si vous avez quelque chose de générique (comme (None,) rien match), il serait grand

Merci Louis

+5

'list' est un mot réservé, vous ne devriez pas l'utiliser comme un identifiant. –

+0

en effet: c'était à titre de démonstration seulement: je l'ai enlevé quand même – Louis

+0

peut-être pourriez-vous poster un exemple de ce que vous voulez? disons que vous avez 'my_list = [1, 2, None, 4]' et 'filter_list' = [2]' ce qui devrait être la sortie. ajouter des entrées de votre choix – SilentGhost

Répondre

5

__contains__ est la méthode magique qui vérifie si quelque chose est dans une séquence:

class everything(object): 
    def __contains__(self, _): 
     return True   

for x in (1,2,3): 
    print x in everything() 
4

La meilleure syntaxe serait:

[x for x in lst if x is None] 
[x for x in lst if x is not None] 
+0

plz lire la reformulation de la question – Louis

0

Vous n'avez pas besoin if, vous pouvez juste dire

[x for x in list] 
+0

Comment pouvez-vous justifier cela: >>> l = [Aucun, 1, 3] >>> [x pour x en l] [Aucun, 1, 3] – aatifh

+0

@aatifh: ce n'est pas la syntaxe python – SilentGhost

+0

le 'si' était parce que je filtre sur un champ: ti est maintenant correct en question – Louis

3

Que voulez-vous dire par

Je voudrais avoir la même chose à tout correspondre

Il suffit de faire

[x for x in list] 

et chaque élément dans list est apparié .

+0

plz lire la reformulation de la question – Louis

0

mais je voudrais avoir la même chose pour correspondre à tout

A tout ce match, vous n'avez pas besoin si la déclaration

[x for x in list1] 

ou Si vous aimez vraiment faire

[x for x in list1 if x in [x]] 
+0

plz lire la reformulation de la question – Louis

0

En réponse à votre question révisée: la liste qui "correspond" à toutes les valeurs possibles est effectivement de longueur infinie. Vous ne pouvez donc pas faire ce que vous voulez faire sans un test if. Je suggère que votre arg devrait être une liste ou l'une des deux valeurs représentant les « tous » et « aucun » cas:

FILTER_NONE = object() # or [] 
FILTER_ALL = object() 

def filter_func(alist, filter_list): 
    if filter_list is FILTER_ALL: 
     return [] 
    elif filter_list is FILTER_NONE: 
     return alist 
     # or maybe alist[:] # copy the list 
    return [x for x in alist if x not in filter_list] 

Si filter_list est grande, vous voudrez peut-être le remplacer la dernière ligne par:

filter_set = set(filter_list) 
    return [x for x in alist if x not in filter_set] 

Sinon, ne vous embêtez pas; juste document que filter_list (renommé comme filter_collection) peut être tout ce qui supporte __contains__() et rappeler aux lecteurs que les jeux seront plus rapides que les listes.

3

Vous pouvez modifier votre programme pour accepter un objet de filtre, au lieu d'une liste.

Le filtre de base abstraite aurait une méthode matches, qui retourne vrai si x * correspond à »

Vos filtres de cas généraux seraient construits avec un argument de liste, et filtrerait sur l'adhésion de la liste -. La matches fonction rechercherait la liste et revenir true si l'argument était dans la liste

Vous pourriez aussi avoir deux sous-classes spéciales de l'objet du filtre:.. rien et tout

Ceux-ci ont des fonctions de match spécial qui soit toujours retour true (tous) ou false (aucun).

Questions connexes