Domanda

La libreria standard Python definisce un any() Funzionalo

Restituisce vero se un elemento dell'iterabile è vero. Se l'iterabile è vuoto, restituisce falso.

Controlla solo se gli elementi valutano True. Quello che voglio che sia in grado, quindi specificare un callback per dire se un elemento si adatta alla fattura come:

any([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0)
È stato utile?

Soluzione

Che ne dite di:

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

Funziona anche con all() Certo:

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

Altri suggerimenti

qualunque La funzione restituisce vera quando una condizione è vera.

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

In realtà, il concetto di qualunque La funzione viene portata da LISP o si può dire dall'approccio di programmazione della funzione. C'è un'altra funzione che è proprio opposta ad essa tutto

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

Queste due funzioni sono davvero interessanti se usate correttamente.

Dovresti usare una "espressione del generatore", ovvero un costrutto di lingua che può consumare iteratori e applicare filtro ed espressioni su una singola riga:

Per esempio (i ** 2 for i in xrange(10)) è un generatore per il quadrato dei primi 10 numeri naturali (da 0 a 9)

Consentono inoltre una clausola "if" di filtrare l'ITENS sulla clausola "per", quindi per il tuo esempio puoi usare:

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

Leggero miglioramento della risposta di Antoine P

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

Per all()

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

Mentre gli altri hanno dato buone risposte pitoniche (userei solo la risposta accettata nella maggior parte dei casi), volevo solo sottolineare quanto sia facile fare la tua funzione di utilità per farlo da solo se lo preferisci davvero:

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

Penso che lo definirei almeno con il parametro della funzione però, poiché ciò corrisponderebbe più alle funzioni integrate esistenti più da vicino come Map () e Filter ():

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

Il filtro può funzionare, inoltre ti restituisce gli elementi corrispondenti

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

Puoi usare una combinazione di any e map Se vuoi davvero mantenere la tua notazione Lambda in questo modo:

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

Ma è meglio usare un'espressione del generatore perché non costruirà l'intero elenco due volte.

Se tu veramente Vuoi in linea un lambda in qualsiasi () puoi farlo:

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

Devi solo concludere la lambda senza nome e assicurarti che sia invocato su ogni passaggio aggiungendo il ()

Il vantaggio qui è che puoi ancora sfruttare la cortocircuita della valutazione di qualsiasi quando colpisci il primo int

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top