web-dev-qa-db-ja.com

配列> 0で最小値を検索

配列内の最も低い正の値とリスト内でのその位置を見つけようとしています。リスト内の値が重複している場合は、最初のインスタンスのみが関係します。これは私が欲しいものを持っていますが、0が含まれています。

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

たとえば、現状では、

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

次に、位置:2、値:0

現在の位置にしたい:3、値:1

16
user3001499

ジェネレーター式minとともに使用できます。これにより、maの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
35
Ffisegydd

次のように、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'))を使用します。

アイテムの実際のインデックスに沿って反復処理を行うため、別のループで実際のインデックスを見つける必要はありません。

10
thefourtheye

これは、ジェネレータ式でそれを行う別の方法です。 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:

4
neil

次にフィルターを追加します。

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

複雑でアルゴリズム的な方法:

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より大きい要素がないか、リストが空かどうかなどがわかります。

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