2012-01-26 3 views
13

È possibile trasformare questo codice in una lista di comprensione?Creazione di una comprensione elenco Python con un if e break

for i in userInput: 
    if i in wordsTask: 
     a = i 
     break 

so come convertire una parte di esso:

[i for i in userInput if i in wordsTask] 

Ma non so come aggiungere la pausa, e la documentazione non è stato di grande aiuto.

Qualsiasi aiuto sarebbe apprezzato.

risposta

34
a = next(i for i in userInput if i in wordsTask) 

Per rompere il basso un po ':

[i for i in userInput if i in wordsTask] 

produrrà un elenco. Quello che vuoi è il primo elemento nell'elenco. Un modo per farlo è con la funzione successiva:

next([i for i in userInput if i in wordsTask]) 

Avanti restituisce l'elemento successivo da un iteratore. Nel caso di iterabile come una lista, finisce per prendere il primo oggetto.

Ma non v'è alcun motivo per costruire realmente l'elenco, in modo che possiamo utilizzare un generatore di espressione invece:

a = next(i for i in userInput if i in wordsTask) 

Si noti inoltre che se l'espressione generatore è vuoto, questo si tradurrà in un'eccezione: StopIteration . Potresti voler gestire quella situazione. Oppure puoi aggiungere un valore predefinito

a = next((i for i in userInput if i in wordsTask), 42) 
+3

Molto bello! E molto sottile - dati gli OP che chiedono aiuto nella comprensione delle liste di apprendimento, probabilmente dovresti spiegare cosa sta succedendo qui. – sblom

+3

nota che se 'len (userInput) == 0' potrebbe essere' True', allora si dovrebbe fornire un valore predefinito tramite il secondo argomento di 'next':' a = next ((espressione del generatore), default) ' –

+0

renderlo un poco più verboso per favore – RanRag