java 求最大值索引_使用列表上的max()/ min()获取返回的最大或最小项目的索引...

我在清单上使用Python的max和min函数进行minimax算法,并且需要max()或min()返回的值的索引。 换句话说,我需要知道哪个移动产生了最大(第一玩家回合)或最小(第二玩家)值。

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()

如果原地反转的副作用无关紧要,则可以省略最后一行。

遍历所有事件

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()解决方案,而改用

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

因为它不需要import operator或使用enumerate ,并且它总是比使用itemgetter()的解决方案更快(下面的基准itemgetter() 。

如果您正在处理numpy数组或可以负担numpy作为依赖项,请考虑同时使用

import numpy as np

index_min = np.argmin(values)

即使在以下情况下将其应用于纯Python列表,也将比第一个解决方案更快。

它大于几个元素(我的机器上大约2 ** 4个元素)

您可以负担得起从纯列表到numpy数组的内存副本

正如该基准所指出的: UTXzO.png

我已经使用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))

将给您第一个最小索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值