返回列表中最后一个非零元素的索引

Vin*_*ent 6 python numpy list

我得到以下格式的数据:

[-2, -2, 0, 0, 0, 0, 0]
[-2, 20, -1, 0, 3, 0, 0]
Run Code Online (Sandbox Code Playgroud)

每行都是不同的输入。该列表可能超过7个元素。我需要返回最后一个非零元素的索引位置,因此:

[-2, -2, 0, 0, 0, 0, 0]
>>> 1
[-2, 20, -1, 0, 3, 0, 0]
>>> 4
Run Code Online (Sandbox Code Playgroud)

以下代码大部分时间都是这样做的:

def getIndex(list):
    for element in reversed(list):
        if element != 0:
            return list.index(element)
Run Code Online (Sandbox Code Playgroud)

但是,当有两个相同的数字时(如上面的第一个示例),该数字将返回,0因为-2它同时位于列表的第0位和第1位,因此不起作用。

那么,即使存在具有相同值的元素,如何获取列表的最后一个非零元素的索引呢?

khy*_*yox 20

这个问题被标记为numpy但我没有看到明显的解决方案:

numpy.max(numpy.nonzero(list))
Run Code Online (Sandbox Code Playgroud)

提供列表的示例

>>> import numpy as np
>>> np.max(np.nonzero([-2, -2, 0, 0, 0, 0, 0]))
1
>>> np.max(np.nonzero([-2, 20, -1, 0, 3, 0, 0]))
4
Run Code Online (Sandbox Code Playgroud)

  • 或者甚至取`np.nonzero`返回的最后一个元素:`np.nonzero(a)[-1]`。 (4认同)

Inc*_*nnu 9

列表理解可以解决问题:

a = [-2, 20, -1, 0, 3, 0, 0]
ls = [i for i, e in enumerate(a) if e != 0]
print(ls)
Run Code Online (Sandbox Code Playgroud)

输出:

[0, 1, 2, 4]
Run Code Online (Sandbox Code Playgroud)


hir*_*ist 5

这是一个完全由生成器组成的版本:您的列表都不会被复制。

a = [-2, -2, 0, 0, 0, 0, 0]
b = [-2, 20, -1, 0, 3, 0, 0]

def index_of_last_nonzero(lst):
    for i, value in enumerate(reversed(lst)):
        if value != 0:
            return len(lst)-i-1
    return -1

print(index_of_last_nonzero(lst=a))  # -> 1
print(index_of_last_nonzero(lst=b))  # -> 4
Run Code Online (Sandbox Code Playgroud)

reversed这个想法是在计数时迭代列表(使用enumerate)。如果列表全为零-1则返回。


the*_*eye 5

您可以迭代reversed列表并返回第一个不为零的项目,如下所示

>>> def get_last_non_zero_index(d, default=None):
...     rev = (len(d) - idx for idx, item in enumerate(reversed(d), 1) if item)
...     return next(rev, default)
...
>>> print(get_last_non_zero_index([-2, -2, 0, 0, 0, 0, 0]))
1
>>> print(get_last_non_zero_index([-2, 20, -1, 0, 3, 0, 0]))
4
>>> print(get_last_non_zero_index([0, 0, 0]))
None
>>> print(get_last_non_zero_index([]))
None
Run Code Online (Sandbox Code Playgroud)

default如果函数找不到非零值,则返回该值。