我在清單上使用Python的max
和min
函數進行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)
我須要可以返回最小值或最大值的實際索引,而不單單是返回值。 算法
只是已經說過的一小部分。 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)
多是一個更好的主意。 函數
假設您有一個列表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列表,也將比第一個解決方案更快。
numpy
數組的內存副本 我已經使用python 2.7在機器上運行了基準測試,用於上述兩個解決方案(藍色:純python,第一個解決方案)(紅色,numpy解決方案)以及基於itemgetter()
的標準解決方案(黑色,參考解決方案)。 與python 3.5相同的基準測試代表,這些方法與上述python 2.7狀況徹底相同
若是要在數字列表中查找max的索引(彷佛是這種狀況),那麼建議您使用numpy:
import numpy as np ind = np.argmax(mylist)
可能更簡單的解決方案是將值的數組轉換爲值,索引對的數組,並取其最大值/最小值。 這將給出具備最大值/最小值的最大/最小索引(即,經過首先比較第一個元素,而後比較第二個元素(若是第一個元素相同,則比較第二對元素))。 注意,實際上不須要建立數組,由於最小/最大容許生成器做爲輸入。
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))
將給您第一個最小索引。