Фильтровать список Python по предикату - PullRequest
38 голосов
/ 14 ноября 2008

Я бы хотел сделать что-то вроде:

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

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

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

1 Ответ

60 голосов
/ 14 ноября 2008

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


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

РЕДАКТИРОВАТЬ: для поиска (один элемент), вы можете попробовать:


>>> next(x for x in lst if x % 2 == 0)
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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...