【问题标题】:Find min value in array > 0在数组中查找最小值 > 0
【发布时间】:2021-10-27 08:59:17
【问题描述】:

我正在寻找数组中的最低正值及其在列表中的位置。如果列表中的值重复,则仅对第一个实例感兴趣。这就是我所拥有的,它可以满足我的需求,但包含 0。

print "Position:", myArray.index(min(myArray))
print "Value:", min(myArray)

例如,如果,

myArray = [4, 8, 0, 1, 5]

那么位置:2,值:0

我希望它显示位置:3,值:1

【问题讨论】:

  • 你能在你的数组中得到重复的值吗?如果是这样,您是否只对一审的位置感兴趣?
  • 重复是很有可能的,是的,第一个实例是感兴趣的,感谢您指出这一点,将修改问题
  • 我对问题描述感到困惑:它说“我正在寻找一个数组中大于 0 的最小值及其对应位置”,这对我来说就像任务是找到大于零且大于其对应位置的最小值。我想这实际上是为了找到大于零的最小值(及其位置)......
  • 请注意,如果列表中没有大于 0 的项目,下面给出的所有解决方案都将失败。

标签: python list search min


【解决方案1】:

这是使用生成器表达式的另一种方法。请注意来自 enumerate (a 和 b) 的值如何在元组中交换以正确排序。

value,position = min(((b,a) for a,b in enumerate(myArray) if b>0), default=(None,None))

当生成器表达式不返回任何内容(即没有大于 0 的项目)时,将返回默认参数。默认值可以设置为周围程序逻辑中任何有意义的值 - 这里返回 None 将允许您使用 if value:if position: 进行测试

【讨论】:

  • 这应该被接受,它比其他答案更 Pythonic 和更快。
  • 如果它能够容忍没有值 >0 的情况就好了。
  • @EL_DON - 那怎么样?在意识到min 有一个默认参数之前,我尝试了几种笨拙的方法。
  • 我的版本似乎没有min 的默认参数。不过,看起来是一个很好的解决方案。另外,我发现如果我正确地形成我的输入,我就不会遇到问题。想象一下。
  • @EL_DON 好像是3.4加入的
【解决方案2】:

复杂/算法的方式:

int min = array[0], i = 1
list smallest //list of indexes of the smallest element 

// find the first element greater than 0
while (min <= 0 and i < array.length) {
    min = array[i]
    i++
}

// find the first instance of the smallest element greater than 0
while (i < array.length) {
    if (array[i] < min and array[i] > 0) {
        clear the list
        min = array[i]
        list.append(i)
    }
    else if (array[i] == min) {
        list.append(i)
    }
    i++;
}

大于 0 的最小元素的第一个实例现在是您添加到列表中的第一个元素。

编辑:您还将获得每个最小值索引的列表。一些简单的检查可以告诉你数组中是否没有大于0的元素,或者列表是否为空等。

【讨论】:

  • 我会说使用 for 比使用 while 更 Pythonic,尤其是在这种情况下。此外,如果您需要索引和值,枚举是要走的路,正如在thefourthey answer中指出的那样
  • 没错,不过,我会按原样保留答案。对于任何对为什么会这样感兴趣的人,请查看:stackoverflow.com/questions/920645/…
【解决方案3】:
import numpy as np

x = np.array([1,2,0,5,10])
x = np.extract(x>0,x)
min_index = np.amin(x)
min_value = np.argmin(x)

【讨论】:

    【解决方案4】:

    您可以将generator expressionmin 一起使用。这会将m 设置为a 中大于0 的最小值。然后它使用list.index 查找该值第一次出现的索引。

    a = [4, 8, 0, 1, 5]
    
    m = min(i for i in a if i > 0)
    
    print("Position:", a.index(m))
    print("Value:", m)
    # Position: 3
    # Value: 1
    

    【讨论】:

    • @user3001499 我对你问题中的措辞感到困惑,现在添加了一条评论来解释我的困惑。
    • 在最坏的情况下,此解决方案需要遍历a 两次(如果最小值位于列表末尾)。
    • 是的,老实说,如果我接受的话,我会接受下面的 thefourtheye 的回答(这就是我赞成它的原因)。 @user3001499 我建议您使用 thefourtheye 的解决方案(如果您不接受我的帮助也不会感到难过 :))
    • @Ffisegydd 我是 python 新手,并被建议避免使用 lambda 表达式,直到我对使用该语言更有信心,所以感谢您的建议,但现在我将使用您的答案
    • 请注意,如果列表 a 的所有成员都不大于零,则此技术将引发 ValueError
    【解决方案5】:

    然后添加一个过滤器:

    myArray = [4, 8, 0, 1, 5]
    result = min(filter(lambda x: x > 0, myArray))
    print result # 1
    print myArray.index(result) # 3
    

    【讨论】:

    • 只给出最低值;它没有给出数组中的位置。
    【解决方案6】:

    你可以使用min函数和enumerate函数,像这样

    result = min(enumerate(a), key=lambda x: x[1] if x[1] > 0 else float('inf'))
    print("Position : {}, Value : {}".format(*result)
    # Position : 3, Value : 1
    

    这确保如果该值大于0,则使用该值进行最小值比较,否则使用最大可能值 (float('inf'))。

    由于我们与项目的实际索引一起迭代,我们不必通过另一个循环找到实际索引。

    【讨论】:

    • 我第一次看到以这种方式使用枚举,很好的提示!
    • 赞成这个,因为它是第一个使用 enumerate 的(避免遍历 a 两次)。
    • 赞成使用 min 函数的关键参数 - 而不是使用生成器循环。
    【解决方案7】:
    def find_min_position(array):
        plus_array = [elem for elem in array if elem > 0]
        min_elem = min(plus_array)
        return min_elem, array.index(min_elem)
    
    In : find_min_position([4, 8, 0, 1, 5])
    Out: (1, 3)
    

    【讨论】:

      猜你喜欢
      • 2020-02-21
      • 1970-01-01
      • 2018-05-03
      • 2018-09-24
      • 2015-04-06
      • 2017-08-18
      相关资源
      最近更新 更多