2008-11-14 3 views
29

Я хотел бы сделать что-то вроде:фильтр списка Python предикат

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

Есть ли что-нибудь приближается к такому поведению в стандартных библиотеках языка Python?

Я знаю, что здесь очень легко катиться, но я ищу более стандартный способ.

ответ

46

Вы можете использовать метод фильтрации:


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

или список понимание:


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

EDIT: для находки (одного элемента), вы можете попробовать:


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

Хотя это приведет к исключению, если ничего не соответствует, поэтому вы, вероятно, захотите обернуть его в try/catch. Скобки() делают это генераторным выражением, а не пониманием списка.

Лично я бы использовал обычный фильтр/понимание и взял первый элемент (если он есть).

Это вызывает исключение, если ничего не найдено

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

Они возвращают пустые списки

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

Спасибо! Это для поиска. Как насчет найти? – 2008-11-14 15:39:22