Python - функционал "найти"? - PullRequest
       8

Python - функционал "найти"?

6 голосов
/ 03 марта 2010

Мне нужна функция, которая способна выполнять итерацию по коллекции, вызывая предоставленную функцию с элементом коллекции в качестве параметра и возвращая параметр или его индекс при получении «True» из предоставленной функции.

Это примерно так:

def find(f, seq, index_only=True, item_only=False):
     """Return first item in sequence where f(item) == True."""
     index = 0
     for item in seq:
         if f(item):
             if index_only:
                 return index
             if item_only:
                 return item
             return index, item
         index+= 1
     raise KeyError

Так что мне интересно, есть ли что-нибудь подобное в стандартном наборе инструментов Python?

Ответы [ 3 ]

3 голосов
/ 03 марта 2010

Попробуйте itertools и, например, ifilter .

3 голосов
/ 03 марта 2010

Я не думаю, что есть такая функция с такой точной семантикой, и в любом случае ваша функция короткая, достаточно хорошая, и вы можете легко улучшить ее для дальнейшего использования, поэтому используйте ее.

потому что простое лучше, чем сложное.

2 голосов
/ 03 марта 2010

Вы можете использовать itertools.dropwhile, чтобы пропустить элементы, для которых предоставленная функция возвращает False, а затем взять первый элемент из остальных (если есть). Если вам нужен индекс, а не элемент, включите enumerate из раздела рецептов itertools документы .

Чтобы изменить значения истинности, возвращаемые предоставленной функцией, используйте lambda (lambda x: not pred (x), где pred - предоставленная функция) или именованную оболочку:

def negate(f):
    def wrapped(x):
        return not f(x)
    return wrapped

Пример:

def odd(x): return x % 2 == 1
itertools.dropwhile(negate(odd), [2,4,1]).next()
# => 1

Будет выброшено StopIteration, если не найдено ни одного подходящего предмета; оберните его в свою собственную функцию, чтобы вместо этого выдать исключение по вашему выбору.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...