2010-07-12 2 views

Répondre

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

si vous ne voulez pas soulever une erreur StopIteration, juste fournir une valeur par défaut à la next fonction:

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

P.S. N'utilisez pas list comme nom de variable, il ombrera intégré.

+0

Un vote en haut et un applaudissement pour la brièveté et l'exactitude. –

+1

Vous avez raison! changé de liste en liste_ (conformément à 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

Une façon relativement élégante de le faire est:

map(bool, a).index(True) 

(où "a" est votre liste ... J'évite le nom de la variable "liste" pour éviter impérieuses la fonction "liste" native)

+1

qui ne fonctionne que dans python-2.x et de toute façon il construit la liste complète des valeurs booléennes. – SilentGhost

+0

@SilentGhost - Vrai. Je n'avais pas réalisé que la carte avait changé dans python3. –

0
next(i for i, v in enumerate(list) if v) 
Questions connexes