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

Python在列表中查找非零数的第一个实例,python,list,Python,List,我有一张这样的清单 myList = [0.0 , 0.0, 0.0, 2.0, 2.0] 我想找出列表中第一个不等于零的数字的位置 myList.index(2.0) 在本例中有效,但有时第一个非零数将为1或3 有没有快速的方法可以做到这一点?使用next和enumerate: >>> myList = [0.0 , 0.0, 0.0, 2.0, 2.0] >>> next((i for i, x in enumerate(myList) if x),

我有一张这样的清单

myList = [0.0 , 0.0, 0.0, 2.0, 2.0]
我想找出列表中第一个不等于零的数字的位置

myList.index(2.0)
在本例中有效,但有时第一个非零数将为1或3


有没有快速的方法可以做到这一点?

使用
next
enumerate

>>> 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

只需使用列表:

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

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

使用enumerate怎么样?检查文档

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

这里有一个简单的例子:

val = next((index for index,value in enumerate(myList) if value != 0), None)
基本上,它用于查找第一个值,如果没有,则返回
None
。用于生成一个迭代器,该迭代器对索引、值元组进行迭代,以便我们知道所处的索引。

使用

Python 2:

myList=[0.0,0.0,0.0,2.0,2.0]
myList2=[0.0,0.0]
myList.index(过滤器(lambda x:x!=0,myList)[0])#3
myList2.索引(筛选器(lambda x:x!=0,myList2)[0])#索引器
Python 3:(感谢Matthias的评论):

myList.index(下一个(过滤器(lambda x:x!=0,myList))#3
myList2.index(下一个(过滤器(lambda x:x!=0,myList2))#停止迭代

您必须处理特殊情况。

您可以使用numpy.nonzero:


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

这个怎么样:

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

做以下事情怎么样:

print (np.nonzero(np.array(myList))[0][0])
这更方便,因为除了查找非零值,这也有助于直接应用逻辑函数。例如:

print (np.nonzero(np.array(myList)>1))

只是在与浮点数进行比较时要小心。我怀疑你得到了很多反对票,因为你的问题没有证明你符合要求。这只是一个对将来的问题有用的提示。同时,这也是一个对反对者有用的提示,让用户知道你为什么反对投票,以便他们可以进行更正。相关:,这并没有给出索引,它只是从列表中筛选出非零元素。也是一个很好的选择,与
next
的主要区别在于
next
提供了一个默认值,而这会引发一个异常。对于Python3,您可以使用
myList.index(next(filter(lambda x:x!=0,myList))
我最喜欢这个答案,但在Matthias mod中使用“next”。注意,在任何情况下,根据情况,首先应该考虑任何(MyLIST)的测试,以确保至少有一个非零值。它可能有助于程序流和避免异常。这将找不到第一个非零元素,例如对于
[0,0,1,2]
。对于numpy数组,什么是等效的?
[i for i, x in enumerate(myList) if x][0]
print (np.nonzero(np.array(myList))[0][0])
print (np.nonzero(np.array(myList)>1))