Question

La bibliothèque standard Python définit un any() fonctionne que

Retour True si un élément de l'ITable est vrai. Si l'itérable est vide, revenez faux.

Il ne vérifie que si les éléments évaluent à True. Ce que je veux qu'il puisse puis spécifier un rappel pour dire si un élément correspond à la facture comme:

any([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0)
Était-ce utile?

La solution

Que diriez-vous:

>>> any(isinstance(e, int) and e > 0 for e in [1,2,'joe'])
True

Cela fonctionne également avec all() bien sûr:

>>> all(isinstance(e, int) and e > 0 for e in [1,2,'joe'])
False

Autres conseils

n'importe quel La fonction renvoie true lorsque toute condition est vraie.

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

En fait, le concept de n'importe quel La fonction est apportée de LISP ou vous pouvez dire à partir de l'approche de programmation de fonction. Il y a une autre fonction qui est juste en face tout

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

Ces deux fonctions sont vraiment cool lorsqu'elles sont utilisées correctement.

Vous devez utiliser une "expression du générateur" - c'est-à-dire une construction en langue qui peut consommer des itérateurs et appliquer le filtre et les expressions sur une seule ligne:

Par exemple (i ** 2 for i in xrange(10)) est un générateur pour le carré des 10 premiers nombres naturels (0 à 9)

Ils permettent également à une clause "if" de filtrer les itétres sur la clause "pour", donc pour votre exemple, vous pouvez utiliser:

any (e for e in [1, 2, 'joe'] if isinstance(e, int) and e > 0)

Légère amélioration de la réponse d'Antoine P

>>> any(type(e) is int for e in [1,2,'joe'])
True

Pour all()

>>> all(type(e) is int for e in [1,2,'joe'])
False

Alors que les autres ont donné de bonnes réponses pythoniques (j'utiliserais simplement la réponse acceptée dans la plupart des cas), je voulais juste souligner à quel point il est facile de faire votre propre fonction d'utilité pour le faire vous-même si vous le préférez vraiment:

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

Je pense que je le définirais au moins avec le paramètre de fonction d'abord, car cela correspondait plus étroitement aux fonctions intégrées existantes comme map () et filter ():

def any_lambda(function, iterable):
  return any(function(i) for i in iterable)

Le filtre peut fonctionner, plus il vous renvoie les éléments correspondants

>>> filter(lambda e: isinstance(e, int) and e > 0, [1,2,'joe'])
[1, 2]

Vous pouvez utiliser une combinaison de any et map Si vous voulez vraiment garder votre notation lambda comme tel:

any(map(lambda e: isinstance(e, int) and e > 0, [1, 2, 'joe']))

Mais il est préférable d'utiliser une expression de générateur car elle ne construira pas la liste entière deux fois.

Si vous vraiment Vous voulez en informer un lambda dans n'importe quel (), vous pouvez faire ceci:

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

Il vous suffit de conclure le Lambda sans nom et de vous assurer qu'il est invoqué sur chaque passe en ajoutant le ()

L'avantage ici est que vous pouvez toujours profiter de court-circuit de l'évaluation de tout lorsque vous frappez le premier int

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top