Python - 在列表中查找第一个非空项的索引

9

在Python中,找到列表中第一个非空项目的索引最有效、优雅的方法是什么?

例如:

list_ = [None,[],None,[1,2],'StackOverflow',[]]

正确的非空索引应该是:

3
6个回答

20
>>> 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作为变量名,它会覆盖内建的功能。


6
一种相对优雅的方法是:
map(bool, a).index(True)

(其中“a”是您的列表...我避免使用变量名“list”,以避免覆盖原生的“list”函数)

2
这只适用于Python 2.x,并且无论如何都会构建整个布尔值列表。 - SilentGhost
@SilentGhost - 确实。我没有意识到在Python3中map已经改变了。 - Joe Kington

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

1

对于Python 3.x,@Joe Kington的解决方案如下:

list(map(bool, list_)).index(True)

同时考虑使用值而不是索引进行操作

for value in filter(bool, list_):
    ...

这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - BrokenBenchmark

1
next(i for (i, x) in enumerate(L) if x)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接