Найти значение min в массиве> 0

Я ищу, чтобы найти самое низкое положительное значение в массиве и его позицию в списке. Если значение в списке дублируется, интерес представляет только FIRST-экземпляр. Это то, что у меня есть, что делает то, что я хочу, но включает 0.

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

например, если он, если

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

then Position: 2, Value: 0

Я хочу, чтобы он отображал позицию: 3, значение: 1

Ответ 1

Вы можете использовать выражение с помощью min. Это установит 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

Ответ 2

Вы можете использовать функцию 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')).

Поскольку мы итерации вместе с фактическим индексом элементов, нам не нужно находить фактический индекс с другим циклом.

Ответ 3

Вот еще один способ сделать это с выражением генератора. Обратите внимание, как значения, поступающие из перечисления (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:

Ответ 4

добавьте фильтр, затем:

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

Ответ 5

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)

Ответ 6

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)

Ответ 7

сложный алгоритмический способ:

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, теперь является первым элементом, который вы добавили в список.

edit: у вас также будет список каждого индекса наименьшего значения. Некоторые простые проверки могут сказать вам, нет ли элементов в массиве, больших 0, или если список пуст и т.д.