Frage

Die Python Standard Library definiert eine any() funktionieren das

Rückgabe true, wenn ein Element des iterablen wahr ist. Wenn das iterable leer ist, geben Sie falsch zurück.

Es überprüft nur, wenn die Elemente bewertet werden True. Ich möchte, dass es in der Lage ist, einen Rückruf anzugeben, um festzustellen, ob ein Element zur Rechnung passt:

any([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0)
War es hilfreich?

Lösung

Wie wäre es mit:

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

Es funktioniert auch mit all() Natürlich:

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

Andere Tipps

irgendein Die Funktion gibt true zurück, wenn eine Bedingung wahr ist.

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

Eigentlich das Konzept von irgendein Die Funktion wird von Lisp ausgeliefert oder Sie können aus dem Funktionsprogrammieransatz sagen. Es gibt eine andere Funktion, die genau entgegengesetzt ist alle

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

Diese beiden Funktionen sind wirklich cool, wenn sie richtig verwendet werden.

Sie sollten einen "Generatorausdruck" verwenden - dh ein Sprachkonstrukt, mit dem Iteratoren konsumiert werden und Filter und Ausdrücke dann auf eine einzelne Zeile anwenden können:

Zum Beispiel (i ** 2 for i in xrange(10)) ist ein Generator für das Quadrat der ersten 10 natürlichen Zahlen (0 bis 9)

Sie erlauben auch eine "if" -Klausel, die Itens in der "für" -Klausel zu filtern. Daher können Sie für Ihr Beispiel verwenden:

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

Leichte Verbesserung der Antwort von Antoine P

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

Zum all()

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

Während die anderen gute pythonische Antworten gaben (ich würde in den meisten Fällen nur die akzeptierte Antwort verwenden), wollte ich nur darauf hinweisen, wie einfach es ist, Ihre eigene Dienstprogrammfunktion zu machen, um dies selbst zu tun, wenn Sie es wirklich bevorzugen:

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

Ich denke, ich würde es zumindest zuerst mit dem Funktionsparameter definieren, da dies vorhandenen integrierten Funktionen wie MAP () und Filter () besser übereinstimmt:

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

Der Filter kann funktionieren und gibt Ihnen die passenden Elemente zurück

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

Sie können eine Kombination von verwenden any und map Wenn Sie wirklich Ihre Lambda -Notation so halten möchten:

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

Aber es ist besser, einen Generatorausdruck zu verwenden, da er die gesamte Liste nicht zweimal erstellt.

Wenn du Ja wirklich Sie möchten eine Lambda in beliebig () in den Einklagen bringen: Dies können Sie Folgendes tun:

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

Sie müssen nur das unbenannte Lambda abschließen und sicherstellen ()

Der Vorteil hierbei besteht darin, dass Sie immer noch die Kurzstrecke der Bewertung von allen nutzen können, wenn Sie den ersten int treffen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top