リストで max()/min() を使用して返された最大または最小項目のインデックスを取得する 質問する

リストで max()/min() を使用して返された最大または最小項目のインデックスを取得する 質問する

私はミニマックス アルゴリズムのためにリスト上で Python のmaxおよび関数を使用しており、またはminによって返される値のインデックスが必要です。言い換えると、どの動きが最大値 (最初のプレーヤーのターン) または最小値 (2 番目のプレーヤー) を生成したかを知る必要があります。max()min()

for i in range(9):
    new_board = current_board.new_board_with_move([i / 3, i % 3], player)

    if new_board:
        temp = min_max(new_board, depth + 1, not is_min_level)  
        values.append(temp)

if is_min_level:
    return min(values)
else:
    return max(values)

値だけでなく、最小値または最大値の実際のインデックスを返すことができる必要があります。

ベストアンサー1

リストがありvalues = [3,6,1,5]、最小の要素のインデックスが必要であるとしますindex_min = 2。この場合、つまり です。

itemgetter()他の回答で提示されている解決策を避け、代わりに

index_min = min(range(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、最初のソリューション)(赤:NumPyソリューション)とitemgetter()(黒:参照ソリューション)に基づく標準ソリューションのベンチマークをPython 2.7で実行しました。Python 3.5を使用した同じベンチマークでは、上記のPython 2.7の場合とまったく同じ方法を比較できることが示されました。

おすすめ記事