什么是一个很好的单行程序来获取python数组中的最高索引,其值已定义(即不是None):
f( [None, 1, 5, None, 3, None, None] )
将返回:4(因为“最后”定义的元素是4.(具有值3))
确定搜索循环可以完成工作,但感觉不是最佳......
答案 0 :(得分:3)
lst = [None, 1, 5, None, 3, None, None]
# Nothing will be printed if all elements are None.
print max(i for i,num in enumerate(lst) if num is not None)
答案 1 :(得分:2)
循环遍历列表的反转并返回第一个有效项目的索引:
In [70]: next((len(l) - i for i, j in enumerate(l[::-1], 1) if j is not None), 'NOT FOUND')
Out[70]: 4
请注意,由于循环遍历反转数组,正确的索引将为len(l) - i
(如果我们将第一个索引视为1)。
如果您正在寻找功能性和/或更优化的方法,可以使用numpy
及其where
功能:
In [1]: import numpy as np
In [2]: lst = [None, 1, 5, None, 3, None, None]
In [4]: np.where(lst)[0][-1]
Out[4]: 4
答案 2 :(得分:2)
不使用指数的相对Pythonic解决方案:
a = [None, 1, 5, None, 3, None, None]
index = next(i for i, j in reversed(tuple(enumerate(a))) if j)
tuple
让我感到困惑,但由于reversed
无法接收发电机,因此需要它。
答案 3 :(得分:2)
使用filter()
的另一种选择。
>>> my_list = [None, 1, 5, None, 3, None, None]
>>> filter(lambda x: x[1] is not None, enumerate(my_list))[-1][0]
4
但这不适用于空list
或列出所有None
。但是为了处理这个问题,我们可以使用and
和or
语句(因为你需要一行解决方案):
>>> (filter(lambda x: x is not None, my_list) and filter(lambda x: x[1] is not None, enumerate(my_list))[-1][0]) or -1
4
对于上述边缘情况,此表达式将返回-1
。
答案 4 :(得分:1)
您可以创建一个生成器,以反向迭代列表的索引并进行测试,直到达到非None
值对象:
def f(lst):
try:
return next(i for i in range(len(lst)-1, 0, -1) if lst[i] is not None)
except StopIteration:
print 'no item was found'
raise
答案 5 :(得分:0)