List Comprehension che esegue più espressioni, è possibile?

Auron (15880 points)
32 126 194
asked Oct 22, 2017 in Programmare in Python by Auron (15,880 points)
Come da titolo, è possibile creare una List Comprehension che esegua due espressioni?
Mi spiego... la struttura di una tipica L.C. condizionata è:         
                     [<expression> for <element> in <sequence> if <condition>]
E' possibile inserire nell'expression più comandi?

Situazione:Ho un ciclo in lista che al verificarsi di una condizione deve incrementare una variabile e breakare... Posso inserire questo break nella L.C.? Se sì, come?
427 views

2 Answers

gianpcr (4620 points)
5 16 34
answered Oct 22, 2017 by gianpcr (4,620 points)
edited Oct 22, 2017 by gianpcr
Ciao, da quello che so non puoi usare il break in una list comprehension. Per eseguire più comandi puoi passare una funzione alla <expression>. Per "simulare" il break, puoi usare l'eccezione "StopIteration" che una volta attivata interrompe l'iterazione corrente. Per fare un catch di quella eccezione devi inserire la list comprehension all'interno della funzione list.  Nonostante tutto il mio consiglio in questi casi è di evitare la list comprehension.
francesco.dev (33560 points)
14 51 129
commented Oct 22, 2017 by francesco.dev (33,560 points)
Bella risposta!
francesco.dev (33560 points)
14 51 129
answered Oct 22, 2017 by francesco.dev (33,560 points)
Ciao Auron!
Non so se sia possibile mettere vere e proprie espressioni complesse all'interno, però ti posso confermare assolutamente che come espressione ciò che puoi inserire è un qualsiasi tipo di variabile!
Pensa ad una lista fatta di liste annidate, se scrivessi: x for y in lista.... La x è esattamente una lista annidata!

Quindi, infine, non so la concreta realizzazione di quanto dici. Io ad esempio tempo fa cercavo un modo per mettere un corpo di istruzioni qualora la if della list comprehension risultasse vera.

Spero di averti aiutato entrando nel dettaglio dell'espressione (forse già lo sapevi, ma molti di noi no! :D )

Aspettiamo gli altri o il docente per informazioni maggiori
A presto,
- Francesco Pio Scognamiglio
Auron (15880 points)
32 126 194
commented Oct 22, 2017 by Auron (15,880 points)
Si, sapevo come funzionava, e sto cercando di fare esattamente quello che cercavi di fare tu, ovvero 'se la if è vera fammi questo1 e questo2'... e 'questo2' è un 'break'...
francesco.dev (33560 points)
14 51 129
commented Oct 22, 2017 by francesco.dev (33,560 points)
Sei riuscito a mettere almeno il 'questo1'?
Perché io ho provato con: [x for x in lista: if x==3]
Ma dopo la if se metto i due punti e l'istruzione non lo prende!