Ответ 1
Как насчет:
>>> any(isinstance(e, int) and e > 0 for e in [1,2,'joe'])
True
Он также работает с all()
, конечно:
>>> all(isinstance(e, int) and e > 0 for e in [1,2,'joe'])
False
Стандартная библиотека Python определяет функцию any()
, которая
Возвращаем значение True, если какой-либо элемент итерабельности является истинным. Если итерабельность пуста, верните False.
Он проверяет только, если элементы оцениваются до True
. То, что я хочу, чтобы это было возможно, позволяет указать обратный вызов, чтобы определить, соответствует ли элемент счету:
any([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0)
Как насчет:
>>> any(isinstance(e, int) and e > 0 for e in [1,2,'joe'])
True
Он также работает с all()
, конечно:
>>> all(isinstance(e, int) and e > 0 for e in [1,2,'joe'])
False
любая функция возвращает True, когда любое условие имеет значение True.
>>> any(isinstance(e, int) and e > 0 for e in [0 ,0, 1])
True # Returns True because 1 is greater than 0.
>>> any(isinstance(e, int) and e > 0 for e in [0 ,0, 0])
False # Returns False because not a single condition is True.
На самом деле концепция любой функции выводится из Lisp или вы можете сказать из подхода к программированию функций. Существует другая функция, которая прямо противоположна ей: all
>>> all(isinstance(e, int) and e > 0 for e in [1, 33, 22])
True # Returns True when all the condition satisfies.
>>> all(isinstance(e, int) and e > 0 for e in [1, 0, 1])
False # Returns False when a single condition fails.
Эти две функции действительно хороши при правильном использовании.
Yo должен использовать "генераторное выражение", то есть конструкцию языка, которая может потреблять итераторы и применять фильтр и выражения затем в одной строке:
Например, (i ** 2 for i in xrange(10))
является генератором для квадрата первых 10 натуральных чисел (от 0 до 9)
Они также допускают предложение "if" для фильтрации itens в предложении "for", поэтому для вашего примера вы можете использовать:
any (e for e in [1, 2, 'joe'] if isinstance(e, int) and e > 0)
Незначительное улучшение ответа Антуана Р
>>> any(type(e) is int for e in [1,2,'joe'])
True
Для all()
>>> all(type(e) is int for e in [1,2,'joe'])
False
В то время как другие дали хорошие ответы на Pythonic (я бы просто использовал принятый ответ в большинстве случаев), я просто хотел указать, как легко сделать свою собственную функцию полезности, чтобы сделать это самостоятельно, если вы действительно предпочитаете это:
def any_lambda(iterable, function):
return any(function(i) for i in iterable)
In [1]: any_lambda([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0
Out[1]: True
In [2]: any_lambda([-1, '2', 'joe'], lambda e: isinstance(e, int) and e > 0)
Out[2]: False
Я думаю, что хотя бы сначала определил его с параметром функции, поскольку это более точно соответствовало бы существующим встроенным функциям, таким как map() и filter():
def any_lambda(function, iterable):
return any(function(i) for i in iterable)
фильтр может работать, плюс он возвращает вам соответствующие элементы
>>> filter(lambda e: isinstance(e, int) and e > 0, [1,2,'joe'])
[1, 2]
Вы можете использовать комбинацию any
и map
, если вы действительно хотите сохранить свою лямбда-нотацию следующим образом:
any(map(lambda e: isinstance(e, int) and e > 0, [1, 2, 'joe']))
Но лучше использовать выражение генератора, потому что он не будет строить весь список дважды.
Если вы действительно хотите встроить lambda в any(), вы можете сделать это:
>>> any((lambda: isinstance(e, int))() for e in [1,2,'joe'])
True
>>> any((lambda: isinstance(e, int))() for e in ['joe'])
False
Вам просто нужно завернуть неназванный лямбда и убедиться, что он вызывается на каждом проходе, добавляя ()
Преимущество в том, что вы по-прежнему можете воспользоваться коротким замыканием оценки любого, когда вы нажмете первый int