【问题标题】: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 在这里不起作用,或者它可能以我不知道的方式起作用!

【问题讨论】:

标签: python list numpy indices


【解决方案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 的解决方案更易于阅读。所以我接受了这个答案
    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2021-08-24
    • 1970-01-01
    • 2021-04-20
    相关资源
    最近更新 更多