2010-07-12 18 views

Respuesta

15
>>> lst = [None,[],None,[1,2],'StackOverflow',[]] 
>>> next(i for i, j in enumerate(lst) if j) 
3 

si no desea elevar un error de StopIteration, acaba de proporcionar valor predeterminado a la función next:

>>> next((i for i, j in enumerate(lst) if j == 2), 42) 
42 

P.S. no use list como nombre de variable, sombrea el built-in.

+0

Un voto arriba y un aplauso por la brevedad y exactitud. –

+1

¡Tienes razón! cambiado de list a list_ (de acuerdo con PEP8) – Jonathan

2
try: 
    i = next(i for i,v in enumerate(list_) if v) 
except StopIteration: 
    # Handle... 
1
next(i for (i, x) in enumerate(L) if x) 
5

Una forma relativamente elegante de hacerlo es:

map(bool, a).index(True) 

(donde "a" es la lista ... estoy evitando el nombre de la variable "lista" para evitar anulando la función de "lista" nativa)

+1

que solo funciona en python-2.x y de todos modos construye toda la lista de valores booleanos. – SilentGhost

+0

@SilentGhost - Es cierto. No me di cuenta de que el mapa había cambiado en python3. –

0
next(i for i, v in enumerate(list) if v) 
Cuestiones relacionadas