2008-11-14 14 views
29

Ich möchte wie etwas tun:eine Python-Liste von Prädikats Filter

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

Gibt es etwas, ein solches Verhalten in Pythons Standardbibliotheken kurz vor?

Ich weiß, dass es sehr einfach ist, hier zu rollen, aber ich suche nach einem Standardweg.

Antwort

46

Sie können die Filtermethode verwenden:


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

oder eine Liste Verständnis:


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

EDIT: für find (einzelnes Element), könnten Sie versuchen:


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

Das würde zwar eine Ausnahme auslösen, wenn nichts passt, also solltest du es wahrscheinlich in einen try/catch einpacken. Die() Klammern machen dies zu einem Generatorausdruck und nicht zu einem Listenverständnis.

Persönlich aber würde ich nur den regulären Filter/Verständnis verwenden und das erste Element (wenn es eines gibt).

Diese erheben eine Ausnahme, wenn nichts

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

Diese Rückkehr

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

Dank! Das ist zum Finden. Was ist mit finden? –

+1

Anstatt ein Generator Verständnis, könnten Sie auch itertools.ifilter (func, list) .next(), die ein wenig näher an der gewünschten Syntax ist. – Brian

+3

Sie können auch itertools.dropwhile (Lambda x: nicht func (x), Liste) verwenden, die keine Ausnahme auslöst, wenn die Liste kein Element enthält, das das Prädikat erfüllt. Es hat auch den Vorteil, dass es kurzschließen kann, sollte das gewünschte Element vor dem Ende der Liste auftreten. – EfForEffort

Verwandte Themen