2010-07-12 98 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

爲了簡潔和正確,一票贊成和一個掌聲。 – 2010-07-12 15:22:27

+1

你是對的!從列表更改爲list_(符合PEP8) – Jonathan 2010-07-12 15:23:03

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) 

(其中「a」是你的列表...我回避的變量名稱「列表」,以免覆蓋原生的「列表」功能)

+1

只能在python-2.x中使用,並且無論如何它都會生成布爾值的整個列表。 – SilentGhost 2010-07-12 15:24:26

+0

@SilentGhost - 真。我沒有意識到python3中的地圖已經改變。 – 2010-07-12 15:31:39

0
next(i for i, v in enumerate(list) if v) 
相關問題