Вопрос

Стандартная библиотека Python определяет any() функционируйте это

Верните True, если какой -либо элемент итерации верен. Если итерабильный пуст, верните ложь.

Он проверяет, только если элементы оценивают 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

Другие советы

Любые Функция возвращает истину, когда любое условие верно.

>>> 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(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.

Эти две функции действительно прохладные при правильном использовании.

Вы должны использовать «выражение генератора», то есть языковую конструкцию, которая может потреблять итераторов и применять фильтр и выражения, затем на одной строке:

Например (i ** 2 for i in xrange(10)) является генератором для квадрата первых 10 натуральных чисел (от 0 до 9)

Они также позволяют пункту «если» фильтровать 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

В то время как другие дали хорошие питонические ответы (я бы просто использовал принятый ответ в большинстве случаев), я просто хотел указать, как легко сделать вашу собственную функцию утилиты, если вы действительно предпочитаете это:

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']))

Но лучше использовать выражение генератора, потому что оно не будет создавать весь список дважды.

если ты В самом деле Хотите встроить лямбду в любом (), вы можете сделать это:

>>> any((lambda: isinstance(e, int))() for e in [1,2,'joe'])
True
>>> any((lambda: isinstance(e, int))() for e in ['joe'])
False

Вам просто нужно завершить неназванную лямбду и убедиться, что она вызывает на каждом проходе, добавив ()

Преимущество здесь заключается в том, что вы все еще можете воспользоваться коротким окружением оценки любого, когда вы нажимаете на первую инт.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top