我得到以下格式的数据:
[-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)
列表理解可以解决问题:
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)
这是一个完全由生成器组成的版本:您的列表都不会被复制。
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则返回。
您可以迭代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如果函数找不到非零值,则返回该值。