web-dev-qa-db-fra.com

Trouver la valeur min dans le tableau> 0

Je cherche la valeur positive la plus basse dans un tableau et sa position dans la liste. Si une valeur de la liste est dupliquée, seule la PREMIÈRE instance est intéressante. C'est ce que j'ai qui fait ce que je veux mais inclut 0.

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

par exemple, en l'état si,

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

alors Position: 2, Valeur: 0

Je veux qu'il présente la position: 3, valeur: 1

16
user3001499

Vous pouvez utiliser un expression de générateur avec min. Cela définira m comme valeur minimale dans a supérieure à 0. Il utilise ensuite list.index pour trouver l'index de la première apparition de cette valeur.

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
35
Ffisegydd

Vous pouvez utiliser la fonction min et la fonction enumerate, comme ceci

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

Cela garantit que, si la valeur est supérieure à 0, Utilisez cette valeur pour la comparaison de la valeur minimale, sinon utilisez la valeur maximale possible (float('inf')).

Puisque nous itérons avec l'index réel des éléments, nous n'avons pas besoin de trouver l'index réel avec une autre boucle.

10
thefourtheye

Voici une autre façon de le faire avec une expression de générateur. Notez comment les valeurs provenant d'énumération (a et b) sont échangées dans le tuple pour trier correctement.

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

L'argument par défaut sera renvoyé lorsque l'expression de générateur ne renvoie rien (c'est-à-dire qu'il n'y a pas d'éléments supérieurs à 0). La valeur par défaut peut être définie sur ce qui a du sens dans la logique du programme environnant - ici le retour de None vous permettra de tester avec if value: ou if position:

4
neil

ajoutez un filtre puis:

myArray = [4, 8, 0, 1, 5]
result = min(filter(lambda x: x > 0, myArray))
print result # 1
print myArray.index(result) # 3
1
markcial
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)
1
sokoli

la manière compliquée/algorithmique:

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++;
}

la première instance du plus petit élément supérieur à 0 est maintenant le premier élément que vous avez ajouté à la liste.

edit: vous aurez également une liste de chaque index de la plus petite valeur. Quelques vérifications simples peuvent vous indiquer s'il n'y a aucun élément dans le tableau supérieur à 0, ou si la liste est vide, etc.

0
JHaps
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)
0
sramij