リストの max()/min() を使用して、返された最大項目または最小項目のインデックスを取得する
質問
Python を使用しています max
そして min
ミニマックス アルゴリズムのリストに対する関数。 によって返される値のインデックスが必要です。 max()
または min()
. 。言い換えれば、どの手が最大値 (最初のプレイヤーのターン) または最小値 (2 番目のプレイヤー) を生み出したかを知る必要があります。
for i in range(9):
newBoard = currentBoard.newBoardWithMove([i / 3, i % 3], player)
if newBoard:
temp = minMax(newBoard, depth + 1, not isMinLevel)
values.append(temp)
if isMinLevel:
return min(values)
else:
return max(values)
値だけでなく、最小値または最大値の実際のインデックスを返すことができる必要があります。
解決
if isMinLevel: return values.index(min(values)) else: return values.index(max(values))
他のヒント
リストがあると言ってください values = [3,6,1,5]
, 、最小の要素のインデックスが必要です。つまり、 index_min = 2
この場合。
次のような解決策を避けてください itemgetter()
他の回答で提示されているため、代わりに使用してください
index_min = min(xrange(len(values)), key=values.__getitem__)
それは必要ないからです import operator
使用することもありません enumerate
, を使用したソリューションよりも常に高速です (以下のベンチマーク)。 itemgetter()
.
numpy 配列を扱っている場合、または余裕がある場合 numpy
依存関係として、使用することも検討してください。
import numpy as np
index_min = np.argmin(values)
次の場合、これを純粋な Python リストに適用した場合でも、これは最初の解決策よりも高速になります。
- それはいくつかの要素よりも大きいです (私のマシンでは約 2**4 要素)
- 純粋なリストからリストにメモリをコピーする余裕があります。
numpy
配列
上記の 2 つのソリューションについて、Python 2.7 を使用してマシンでベンチマークを実行しました (青:純粋な Python、最初のソリューション) (赤色、ヌクヌクしたソリューション)、および以下に基づく標準ソリューションの場合 itemgetter()
(黒色、参照溶液)。Python 3.5 での同じベンチマークは、メソッドが上記の Python 2.7 の場合とまったく同じであることを示しました。
あなたは、リスト内の項目を列挙しますが、リストの元の値に最小/最大を実行した場合、同時に最小/最大インデックスと値を見つけることができます。これと同様ます:
import operator
min_index, min_value = min(enumerate(values), key=operator.itemgetter(1))
max_index, max_value = max(enumerate(values), key=operator.itemgetter(1))
リストのみ分(または最大)のために一度トラバースされますこの方法です。
、その後、私はあなたがnumpyのを使用することをお勧めます:
import numpy as np
ind = np.argmax(mylist)
おそらくより簡単な解決策は、値の配列に値の配列を回すインデックス対、及びそれの最大/最小を取ることであろう。これは、最大/最小(すなわちペアは、まず、第1の要素を比較し、最初のものが同じである場合には、第2の要素を比較することによって比較される)を有し、最大/最小のインデックスを与えます。最小/最大入力として発電機を可能にするので、それは実際には配列を作成する必要はないことに注意してください。
values = [3,4,5]
(m,i) = max((v,i) for i,v in enumerate(values))
print (m,i) #(5, 2)
list=[1.1412, 4.3453, 5.8709, 0.1314]
list.index(min(list))
あなたの最低限の最初のインデックスを与えます。
私もこの中に興味があったとの perfplotする(ペットのプロジェクトを使用して提案ソリューションのいくつかを比較します鉱山)。
は、 numpyののargmin 、
numpy.argmin(x)
もlist
に入力numpy.array
からの暗黙的な変換を用いて、十分に大きなリストの最速の方法である。
プロットを生成するためのコード:
import numpy
import operator
import perfplot
def min_enumerate(a):
return min(enumerate(a), key=lambda x: x[1])[0]
def min_enumerate_itemgetter(a):
min_index, min_value = min(enumerate(a), key=operator.itemgetter(1))
return min_index
def getitem(a):
return min(range(len(a)), key=a.__getitem__)
def np_argmin(a):
return numpy.argmin(a)
perfplot.show(
setup=lambda n: numpy.random.rand(n).tolist(),
kernels=[
min_enumerate,
min_enumerate_itemgetter,
getitem,
np_argmin,
],
n_range=[2**k for k in range(15)],
logx=True,
logy=True,
)
numpyのアレイとARGMAX()関数を使用して
a=np.array([1,2,3])
b=np.argmax(a)
print(b) #2
あなたが最大値を取得した後、これを試してみます:
max_val = max(list)
index_max = list.index(max_val)
多くのオプションよりもはるかに簡単ます。
私が行うための最善のことはnumpy array
にリストを変換し、この機能を使用すると思います:
a = np.array(list)
idx = np.argmax(a)
私は上記の答えはあなたの問題を解決すると思いますが、私は、私はあなたの最小値と最小値がに表示され、すべての指標を与える方法を共有したいと思っています。
minval = min(mylist)
ind = [i for i, v in enumerate(mylist) if v == minval]
この二回のリストを渡しますが、それでも非常に高速です。ただし、最低の最初の出会いのインデックスを見つけることよりもわずかに遅いです。だから、あなただけの1極小のが必要な場合は、場合、マット・アンダーソンののソリューションを使用しますあなたはこれを使用し、それらすべてを必要とします。
使用numpyのモジュールの機能numpy.where
import numpy as n
x = n.array((3,3,4,7,4,56,65,1))
の最小値のインデックスを示します。
idx = n.where(x==x.min())[0]
最大値のインデックスを示します。
idx = n.where(x==x.max())[0]
実際には、この機能ははるかに強力です。あなたは、ブール演算のすべての種類を提起することができます 3と60の間の値のインデックスの
idx = n.where((x>3)&(x<60))[0]
idx
array([2, 3, 4, 5])
x[idx]
array([ 4, 7, 4, 56])
このビルトインenumerate()
とmax()
機能とkey
機能と簡単なラムダ式のオプションmax()
引数を使用して簡単に可能です。
theList = [1, 5, 10]
maxIndex, maxValue = max(enumerate(theList), key=lambda v: v[1])
# => (2, 10)
max()
のドキュメントでは、key
引数と言います list.sort()
の機能などの機能が期待しています。また、 をするにはどのようにソートを参照してください。
これはmin()
に対しても同じ働きをします。ところで、それは最初の最大/最小値を返します。
限り、あなたはラムダと「キー」引数を使用する方法を知っているように、簡単な解決策はあります:
max_index = max( range( len(my_list) ), key = lambda index : my_list[ index ] )
次のようなリストを持っていると言います
a = [9,8,7]
次の2つの方法が最小の要素とそのインデックスを持つタプルを取得するには、かなりコンパクトな方法があります。どちらも、処理するための類似したの時間がかかります。より良いジップ法のようなIが、それは私の好みです。
ジップ方法
element, index = min(list(zip(a, range(len(a)))))
min(list(zip(a, range(len(a)))))
(7, 2)
timeit min(list(zip(a, range(len(a)))))
1.36 µs ± 107 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
列挙方法
index, element = min(list(enumerate(a)), key=lambda x:x[1])
min(list(enumerate(a)), key=lambda x:x[1])
(2, 7)
timeit min(list(enumerate(a)), key=lambda x:x[1])
1.45 µs ± 78.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
なぜ最初のインデックスを追加し、それらを逆にする気?列挙()関数は、ただのzip()関数の使用の特殊なケースです。のは、appropiate方法でそれを使用してみましょう。
my_indexed_list = zip(my_list, range(len(my_list)))
min_value, min_index = min(my_indexed_list)
max_value, max_index = max(my_indexed_list)
すでに述べたことにだけマイナーほか。
values.index(min(values))
は分の最小のインデックスを返すようです。以下の最大のインデックスを取得します:
values.reverse()
(values.index(min(values)) + len(values) - 1) % len(values)
values.reverse()
場所に逆転の副作用が問題にならない場合は、最後の行は省略することができます。
すべての出現を反復処理するには、
indices = []
i = -1
for _ in range(values.count(min(values))):
i = values[i + 1:].index(min(values)) + i + 1
indices.append(i)
簡潔にするため。ループの外min(values), values.count(min)
をキャッシュするために、おそらく良いアイデアです。
あなたは追加のモジュールをインポートしたくない場合は、リストには、最小限の値でインデックスを見つけるための簡単な方法:
min_value = min(values)
indexes_with_min_value = [i for i in range(0,len(values)) if values[i] == min_value]
そして、例えば最初のいずれかを選択します:
choosen = indexes_with_min_value[0]
そのような単純なます:
stuff = [2, 4, 8, 15, 11]
index = stuff.index(max(stuff))
は、既存の回答にコメントするには十分に高い担当者を持っていけない。
しかし、 https://stackoverflow.com/a/11825864/3920439 の答えのための
これは、整数のために動作しますが、(少なくとものpython 3.6に)floatの配列のために動作しません。
それはTypeError: list indices must be integers or slices, not float
を発生させます。
https://docs.python.org/3/library/functions。 htmlの#最大の
複数のアイテムが最大であれば、、関数が遭遇した最初のものを返します。これは、sorted(iterable, key=keyfunc, reverse=True)[0]
などの他のソート・安定性維持のツールと一致している。
sortメソッドを単に最初の使用よりも取得する。
import operator
x = [2, 5, 7, 4, 8, 2, 6, 1, 7, 1, 8, 3, 4, 9, 3, 6, 5, 0, 9, 0]
min = False
max = True
min_val_index = sorted( list(zip(x, range(len(x)))), key = operator.itemgetter(0), reverse = min )
max_val_index = sorted( list(zip(x, range(len(x)))), key = operator.itemgetter(0), reverse = max )
min_val_index[0]
>(0, 17)
max_val_index[0]
>(9, 13)
import ittertools
max_val = max_val_index[0][0]
maxes = [n for n in itertools.takewhile(lambda x: x[0] == max_val, max_val_index)]