在给定条件的情况下查找列表的最小和最大索引

Posted

技术标签:

【中文标题】在给定条件的情况下查找列表的最小和最大索引【英文标题】:Find the minimum and maximum indices of a list given a condition 【发布时间】:2016-04-11 17:51:09 【问题描述】:

我有一个清单,比如说:

list_A = [0,0,0,1.0,2.0,3.0,2.0,1.0,0,0,0]

我想找到这个列表的最小和最大索引list_A > 0,即在上面的例子中,它应该是 3 和 7。

对于其他单调增加的列表,我一直使用np.searchsorted,如np.searchsorted(list,[0.5,1.0]) 来查找列表分别为between 0.5 and 1.0 的索引。

但这种情况完全不同,np.searchsorted 在这里不起作用,或者它可能以我不知道的方式起作用!

【问题讨论】:

这是重复的***.com/questions/7270321/…(不知道怎么标出来) 【参考方案1】:

您可以使用np.where 函数返回所有elements > 0 的索引

In [116]: list_A = [0,0,0,1.0,2.0,3.0,2.0,1.0,0,0,0]

In [117]: arr = np.array(list_A)

In [118]: indx = np.where(arr > 0)[0]

In [119]: mini = indx[0]

In [120]: mini
Out[120]: 3

In [121]: maxi = indx[-1]

In [122]: maxi
Out[122]: 7

【讨论】:

【参考方案2】:

用索引过滤压缩列表并取最小值和最大值:

>>> list_A = [0,0,0,1.0,2.0,3.0,2.0,1.0,0,0,0]
>>> filtered_lst = [(x,y) for x,y in enumerate(list_A) if y > 0]
>>> max(filtered_lst)
(7, 1.0)
>>> min(filtered_lst)
(3, 1.0)

如果只需要索引,解包返回值:

>>> maX,_ =  max(filtered_lst)
>>> maX
7

【讨论】:

您的解决方案非常简单。但我需要的只是索引,而不是值(即 1.0)。 filtered_list[0] 不起作用?【参考方案3】:

另一种方法是使用next():

list_A = [0,0,0,1.0,2.0,3.0,2.0,1.0,0,0,0]

print(next(idx for idx, item in enumerate(list_A) if item>0))
print(next(len(list_A)-1-idx for idx, item in enumerate(list_A[::-1]) if item>0))

输出

3
7

使用next() 查找列表中的第一项> 0 是一个优雅的解决方案。

要在列表> 0 中找到最后一个 项,使用这种方法比较棘手。我使用next() 迭代并使用list_A[::-1] 在反向列表中找到第一个> 0。然后,我使用len(list)-1-idx 将生成的索引从len(list)-1 中减去,将其转换为正确的索引。

【讨论】:

您能否进一步说明第二步是做什么的? 是的!但我发现 Daniel 的解决方案更易于阅读。所以我接受了这个答案

以上是关于在给定条件的情况下查找列表的最小和最大索引的主要内容,如果未能解决你的问题,请参考以下文章

分块查找

在 Ocaml 的列表中查找最大/最小数

在给定数组中查找最小值和最大值,其中约束应最小值索引应小于其最大值

在递减然后递增并且可能包含重复项的列表中查找最小值

python - 在给定条件下查找列表中下一项的位置

如何在给定索引列表的情况下有效地更新 numpy ndarray