在Python中查找列表中所有空项的索引

3

我有一个字符串列表,其中一些是None。 我想得到一个新的列表,其中包含所有None的索引。

list = ['a', 'b', None, 'c' ,None, 'd']

使用函数index
n = list.index(None)

只会返回第一个出现的,n=2,但我想看到 n=[2,4]。

谢谢你。

3
dir(builtins) - 这将显示使用"list"作为变量名是个不好的主意。 - Drako
@Drako 是的,对于每个内置方法!! - U13-Forward
1
可能是重复的问题,参考如何在列表中查找所有元素的出现次数? - Nouman
4个回答

16

试试 enumerate

l=[i for i,v in enumerate(list) if v == None]

或者range

l=[i for i in range(len(list)) if list[i] == None]

两种情况:

print(l)

是:

[2,4]

重要提示:不好将变量命名为已存在的方法名称,会覆盖它,(现在是list),所以我更喜欢将其命名为l(或其他名称)

我推荐使用第一个示例,因为enumerate易于使用和高效。


1
@MorZamir 现在您已经拥有超过15个声望值,所以如果您愿意,可以进行投票支持 :-) - U13-Forward
1
有趣的是今天看到你的评论,因为你只有15声望,而在获得了第一个问题1k浏览徽章之后。 - Zusman
1
@MorZamir 恭喜你得到了它,我也有。 - U13-Forward

2
更快的方法。在长列表的情况下非常有用。
list = ['a', 'b', None, 'c' ,None, 'd']
import numpy as np
print(np.where(np.array(list) == None)[0])

输出:

[2 4]

如果您需要索引列表:

print(np.where(np.array(list) == None)[0].tolist())
>>> [2, 4]

1
注意,它有一个警告“FutureWarning: comparison to None will result in an elementwise object comparison in the future.”,将来这将不起作用。 - U13-Forward
1
Python 2.7 中没有警告。 - MEdwin
@MEdwin 噢,我没有在 Python 3 上测试过,那怎么办? - U13-Forward
@Black Thunder。我不知道为什么,但是numpy数组在打印时没有逗号。这就是为什么我使用.tolist()方法的原因。 - LMSharma
第一种方法除了一个空列表之外什么也没有给我。 - Nouman
@Lalit 对于Python 3.6版本是可以的。 - U13-Forward

2

这里有一种不同的方法,但它并不使用列表推导式:

>>> l = ['a', 'b', None, 'c' ,None, 'd']
>>> out = []
>>> for _ in range(l.count(None)):
    out.append(l.index(None))
    l[l.index(None)] = "w"


>>> out
[2, 4]
>>> 

1
只需使用列表推导式即可:
[i for i in list_ if i == None]

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