2012-11-29 21 views
5

Esiste un modo per testare il ritorno di una funzione in una lista (o dict) di comprensione? Mi piacerebbe evitare di scrivere che:Comprensione degli elenchi Python: test function return

lst = [] 
for x in range(10): 
    bar = foo(x) 
    if bar: 
    lst.append(bar) 

e utilizzare invece una comprensione di lista. Ovviamente, non voglio scrivere:

[foo(x) for x in range(10) if foo(x)] 

così?

[foo(x) for x in range(10) if ??? ] 
+1

Perché non si desidera utilizzare il primo modo? È il modo appropriato. –

+0

@Rohit Jain - a seconda di 'foo', potrebbe essere un'operazione costosa che non si desidera eseguire due volte. – mgilson

+1

@mgilson: E nel primo esempio, lo fa solo una volta. –

risposta

10

Come su

filter(None, map(foo, range(10))) 

Se non si desidera mantenere la lista intermedia, sostituire map() con itertools.imap(). E con itertools.ifilter(), l'intera cosa potrebbe essere trasformata in un generatore.

+1

ho sempre sentito come 'filter' dovrebbe prendere una forma 1 argomento così ... – mgilson

+1

O, piuttosto che 'imap', potresti usare un genexp:' filter (None, (foo (x) per x in range (10))) ' – mgilson

+0

Bella soluzione. – Adrien

Problemi correlati