Функция поиска последовательности 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)