Python在列表中找到非零数字的第一个实例

时间:2013-10-21 18:52:55

标签: python list

我有一个像这样的列表

myList = [0.0 , 0.0, 0.0, 2.0, 2.0]

我想找到列表中第一个数字的位置,该位置不等于零。

myList.index(2.0)

适用于此示例,但有时第一个非零数字将为1或3。

有这么快的方法吗?

8 个答案:

答案 0 :(得分:45)

nextenumerate

一起使用
>>> myList = [0.0 , 0.0, 0.0, 2.0, 2.0]
>>> next((i for i, x in enumerate(myList) if x), None) # x!= 0 for strict match
3

答案 1 :(得分:14)

使用filter

Python 2:

myList = [0.0, 0.0, 0.0, 2.0, 2.0]
myList2 = [0.0, 0.0]

myList.index(filter(lambda x: x!=0, myList)[0])       # 3
myList2.index(filter(lambda x: x!=0, myList2)[0])     # IndexError

Python 3 :(感谢Matthias的评论):

myList.index(next(filter(lambda x: x!=0, myList)))    # 3
myList2.index(next(filter(lambda x: x!=0, myList2)))  # StopIteration
# from Ashwini Chaudhary's answer
next((i for i, x in enumerate(myList) if x), None)    # 3
next((i for i, x in enumerate(myList2) if x), None)   # None

你必须处理特殊情况。

答案 2 :(得分:5)

这是一个单行班:

val = next((index for index,value in enumerate(myList) if value != 0), None)

基本上,它使用next()来查找第一个值,如果没有,则返回Noneenumerate()用于创建迭代器,迭代索引,值元组,以便我们知道我们所处的索引。

答案 3 :(得分:4)

当数组很大时,将nextenumerate一起使用是非常好的。对于较小的数组,我会使用argmax中的numpy,这样您就不需要循环:

import numpy as np

myList = [0.0, 0.0, 0.0, 2.0, 2.0]
myArray = np.array(myList)
np.argmax(myArray > 0)
3

答案 4 :(得分:2)

您可以使用numpy.nonzero:http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.nonzero.html

myList = [0.0 , 0.0, 0.0, 2.0, 2.0]
I = np.nonzero(myList)
#the first index is necessary because the vector is within a tuple
first_non_zero_index = I[0][0]
#3

答案 5 :(得分:2)

如何'回复:

[i for i, x in enumerate(myList) if x][0]

答案 6 :(得分:1)

使用枚举怎么样?查看enumerate文档。

def first_non_zero(mylist):
  for index, number in enumerate(mylist):
    if number != 0: # or 'if number:'
      return index

答案 7 :(得分:0)

只需使用列表理解:

myDict = {x: index for index, x in enumerate(myList) if x}

非零元素的索引是myDict[element]