Мне нужна функция, которая способна к итерации по набору, вызыванию предоставленной функции с элементом набора в качестве параметра и возврата параметра, или это - индекс при "Верном" получении из предоставленной функции.
Это - somethong как это:
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?
Вы можете использовать itertools.dropwhile
, чтобы пропустить элементы, для которых поставляемая функция возвращает False
, а затем взять первый элемент из оставшихся (если они есть). Если вам нужен индекс, а не элемент, используйте enumerate
из раздела Recipes в itertools
docs.
Чтобы обратить истинностные значения, возвращаемые поставляемой функцией, используйте 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
, если не найдено ни одного подходящего элемента; оберните это в собственную функцию, чтобы вместо этого вызвать исключение по вашему выбору.
Я не думаю, что есть такая функция с такой точной семантикой, и в любом случае ваша функция короткая, достаточно хорошая, и вы можете легко улучшить ее для дальнейшего использования, поэтому используйте ее.
потому что простое лучше сложного.