使用列表上的max()/ min()獲取返回的最大或最小項目的索引

我在清單上使用Python的maxmin函數進行minimax算法,而且須要max()min()返回的值的索引。 換句話說,我須要知道哪一個移動產生了最大(第一玩家回合)或最小(第二玩家)值。 python

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)

我須要可以返回最小值或最大值的實際索引,而不單單是返回值。 算法


#1樓

只是已經說過的一小部分。 values.index(min(values))彷佛返回最小的min索引。 如下是最大的索引: 數組

values.reverse()
    (values.index(min(values)) + len(values) - 1) % len(values)
    values.reverse()

若是原地反轉的反作用可有可無,則能夠省略最後一行。 緩存

遍歷全部事件 app

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)多是一個更好的主意。 函數


#2樓

假設您有一個列表values = [3,6,1,5] ,而且須要最小元素的索引,在這種狀況下,即index_min = 2測試

避免使用其餘答案中出現的itemgetter()解決方案,而改用 spa

index_min = min(xrange(len(values)), key=values.__getitem__)

由於它不須要import operator或使用enumerate ,而且它老是比使用itemgetter()的解決方案更快(下面的基準itemgetter()code

若是您正在處理numpy數組或能夠負擔numpy做爲依賴項,請考慮同時使用 索引

import numpy as np
index_min = np.argmin(values)

即便在如下狀況下將其應用於純Python列表,也將比第一個解決方案更快。

  • 它大於幾個元素(個人機器上大約2 ** 4個元素)
  • 您能夠負擔得起從純列表到numpy數組的內存副本

正如該基準所指出的: 在此處輸入圖片說明

我已經使用python 2.7在機器上運行了基準測試,用於上述兩個解決方案(藍色:純python,第一個解決方案)(紅色,numpy解決方案)以及基於itemgetter()的標準解決方案(黑色,參考解決方案)。 與python 3.5相同的基準測試代表,這些方法與上述python 2.7狀況徹底相同


#3樓

若是要在數字列表中查找max的索引(彷佛是這種狀況),那麼建議您使用numpy:

import numpy as np
ind = np.argmax(mylist)

#4樓

可能更簡單的解決方案是將值的數組轉換爲值,索引對的數組,並取其最大值/最小值。 這將給出具備最大值/最小值的最大/最小索引(即,經過首先比較第一個元素,而後比較第二個元素(若是第一個元素相同,則比較第二對元素))。 注意,實際上不須要建立數組,由於最小/最大容許生成器做爲輸入。

values = [3,4,5]
(m,i) = max((v,i) for i,v in enumerate(values))
print (m,i) #(5, 2)

#5樓

list=[1.1412, 4.3453, 5.8709, 0.1314]
list.index(min(list))

將給您第一個最小索引。

相關文章
相關標籤/搜索