2008-11-14 8 views
29

Je veux faire quelque chose comme:filtrer une liste Python par prédicat

>>> lst = [1, 2, 3, 4, 5] 
>>> lst.find(lambda x: x % 2 == 0) 
2 
>>> lst.findall(lambda x: x % 2 == 0) 
[2, 4] 

Y at-il en voie d'un tel comportement dans les bibliothèques standard de Python?

Je sais qu'il est très facile à rouler soi-même, mais je suis à la recherche d'une façon plus standard.

Répondre

46

Vous pouvez utiliser la méthode du filtre:


>>> lst = [1, 2, 3, 4, 5] 
>>> filter(lambda x: x % 2 == 0, lst) 
[2, 4] 

ou une compréhension de la liste:


>>> lst = [1, 2, 3, 4, 5] 
>>> [x for x in lst if x %2 == 0] 
[2, 4] 

EDIT: pour trouver (un seul élément), vous pouvez essayer:


>>> (x for x in lst if x % 2 == 0).next() 
2 

Bien que cela lancerait une exception si rien ne correspond, alors vous voudrez probablement envelopper dans un essai/catch. Les parenthèses() en font une expression de générateur plutôt qu'une compréhension de liste.

Personnellement si je venais d'utiliser le filtre régulier/compréhension et prendre le premier élément (s'il y en a un).

Ceux-ci soulèvent une exception si rien ne se trouve

filter(lambda x: x % 2 == 0, lst)[0] 
[x for x in lst if x %2 == 0][0] 

Ces listes de retour vides

filter(lambda x: x % 2 == 0, lst)[:1] 
[x for x in lst if x %2 == 0][:1] 
+1

Merci! C'est pour findall. Qu'en est-il de trouver? –

+1

Au lieu d'une compréhension du générateur, vous pouvez également utiliser itertools.ifilter (Func, liste) .next() qui est un peu plus proche de la syntaxe désirée. – Brian

+3

Vous pouvez également utiliser itertools.dropwhile (lambda x: non func (x), liste) qui ne sera pas jeté une exception si la liste contient aucun élément qui satisfait le prédicat. Il a aussi l'avantage de pouvoir court-circuiter si l'élément désiré se présente avant la fin de la liste. – EfForEffort

Questions connexes