在Python中,找到列表中第一个非空项目的索引最有效、优雅的方法是什么?
例如:
list_ = [None,[],None,[1,2],'StackOverflow',[]]
正确的非空索引应该是:
3
>>> 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
附注:不要使用list
作为变量名,它会覆盖内建的功能。
map(bool, a).index(True)
try:
i = next(i for i,v in enumerate(list_) if v)
except StopIteration:
# Handle...
对于Python 3.x,@Joe Kington的解决方案如下:
list(map(bool, list_)).index(True)
同时考虑使用值而不是索引进行操作
for value in filter(bool, list_):
...
next(i for (i, x) in enumerate(L) if x)
next(i for i, v in enumerate(list) if v)