Подтвердить что ты не робот

Отфильтровать список 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?

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

4b9b3361

Ответ 1

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


>>> 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]