Функция поиска последовательности в Python - PullRequest
25 голосов
/ 18 мая 2011

Как мне найти объект в последовательности, удовлетворяющей определенному критерию?

Понимание списка и фильтрация проходят через весь список. Единственная альтернатива - петля ручной работы?

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

Ответы [ 4 ]

32 голосов
/ 18 мая 2011

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

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, если элемент не был найден.В большинстве случаев это, вероятно, хорошо.Вы запросили первый элемент, такого элемента не существует, и поэтому программа, вероятно, не сможет продолжить работу.

Если, с другой стороны, вы do знаете, что делать в этом случае, выможет предоставить значение по умолчанию 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')
10 голосов
/ 18 мая 2011

На самом деле, в 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.

5 голосов
/ 18 мая 2011

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

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

Если вы хотите, чтобы все больше 10, вам может быть проще использовать список-понимание :

all_gt10 = [i for i in mylist if i > 10]
1 голос
/ 18 мая 2011

Лень писать:

mylist = [10, 2, 20, 5, 50]
max(mylist, key=lambda x: x>10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...