2010-07-12 2 views

ответ

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

, если вы не хотите, чтобы поднять ошибку StopIteration, просто предоставить значение по умолчанию к функции next:

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

P.S. не используйте list в качестве имени переменной, это тени встроены.

+0

Один голос и один аплодисмент за краткость и точность. –

+1

Вы правы! изменен из списка на list_ (в соответствии с 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

Один относительно элегантный способ сделать это:

map(bool, a).index(True) 

(где «а» список ... я избегаю имя переменной «список», чтобы избежать переопределения функция родного «списка»)

+1

, который работает только в python-2.x и в любом случае строит весь список логических значений. – SilentGhost

+0

@SilentGhost - правда. Я не понял, что карта изменилась в python3. –

Смежные вопросы