使用python中的数组中的定义值获取最高索引

时间:2016-10-20 21:16:08

标签: python arrays

什么是一个很好的单行程序来获取python数组中的最高索引,其值已定义(即不是None):

f( [None, 1, 5, None, 3, None, None] )

将返回:4(因为“最后”定义的元素是4.(具有值3))

确定搜索循环可以完成工作,但感觉不是最佳......

6 个答案:

答案 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。但是为了处理这个问题,我们可以使用andor语句(因为你需要一行解决方案):

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

如果输入列表非常大,您可以使用itertools和内置reversed来避免迭代或复制整个事物:

from itertools import dropwhile

def last_non_none(seq):
    return next(dropwhile(lambda x: x is None, reversed(seq)))

如果没有非StopIteration值,这将抛出None,我认为这比返回默认值更具pythonic。