我有一个像这样的列表
myList = [0.0 , 0.0, 0.0, 2.0, 2.0]
我想找到列表中第一个数字的位置,该位置不等于零。
myList.index(2.0)
适用于此示例,但有时第一个非零数字将为1或3。
有这么快的方法吗?
答案 0 :(得分:45)
将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
答案 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()来查找第一个值,如果没有,则返回None
。 enumerate()用于创建迭代器,迭代索引,值元组,以便我们知道我们所处的索引。
答案 3 :(得分:4)
当数组很大时,将next
与enumerate
一起使用是非常好的。对于较小的数组,我会使用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]
。