Функция поиска последовательности python

Как найти объект в последовательности, удовлетворяющей определенному критерию? Просмотр списка и фильтр проходят через весь список. Является ли единственная альтернатива ручным циклом?

mylist = [10, 2, 20, 5, 50]
find(mylist, lambda x:x>10) # returns 20

Ответ 1

здесь шаблон, который я использую:

mylist = [10, 2, 20, 5, 50]
found = next(i for i in mylist if predicate(i))

Или, в python 2.4/2.5 и, next() не является встроенным:

found = (i for i in mylist if predicate(i)).next()

Обратите внимание, что next() вызывает StopIteration, если элемент не найден. В большинстве случаев, вероятно, хорошо, вы попросили первый элемент, такой элемент не существует, поэтому программа, вероятно, не может продолжить.

Если, с другой стороны, вы знаете, что делать в этом случае, вы можете указать значение по умолчанию next():

conf_files = ['~/.foorc', '/etc/foorc']
conf_file = next((f for f in conf_files if os.path.exists(f)),
                 '/usr/lib/share/foo.defaults')

Ответ 2

Собственно, в Python 3, по крайней мере, фильтр не проходит через весь список.

Для двойной проверки:

def test_it(x):
    print(x)
    return x>10

var = next(filter(test_it, range(20)))

В Python 3.2, который печатает 0-11 и присваивает var 11.

В версиях Python 2.x вам может понадобиться использовать itertools.ifilter.

Ответ 3

Если вам нужно только первое больше 10, вы можете использовать itertools.ifilter:

import itertools
first_gt10 = itertools.ifilter(lambda x: x>10, [10, 2, 20, 5, 50]).next()

Если вы хотите, чтобы все больше 10, проще всего использовать list-comprehension:

all_gt10 = [i for i in mylist if i > 10]

Ответ 4

Слишком ленив писать:

mylist = [10, 2, 20, 5, 50]
max(mylist, key=lambda x: x>10)