如何随机返回Python中列表中最大元素之一的索引?
我的程序计算的时间3个不同的值出现,并将它们存储在列表中像这样的classes = [class1,class2,class3]
如何随机返回Python中列表中最大元素之一的索引?
我想返回的最大价值的指标数量,但这些价值往往是重复的。如果是这样的话,我想返回一个在最大值之间随机选择的索引。
例如,如果我有classes = [5,2,5]
,我想输出是0或2。 如果我有classes = [1,1,1]
,0,1和2是细。 最后,如果我有classes = [1,10,1]
,我想要输出1.
到目前为止,我已经将其他问题拼凑在一起,但这不是我想要的方式,我也不明白为什么。
classes = [class1,class2,class3]
dupes = [n for n, x in enumerate(classes) if x in classes[:n]]
class_prediction = dupes[random.randint(0,len(dupes))] + 1
(+1末是返回实际的类标签,而不是指数。)
可以使用random.choice
与列表理解如下
indices = [idx for idx, val in enumerate(values) if val == largest]
random.choice(indices)
作为一个例子,这里是几次调用它的结果
>>> import random
>>> values = [5, 2, 5, 3, 1]
>>> largest = max(values)
>>> indices = [idx for idx, val in enumerate(values) if val == largest]
>>> random.choice(indices)
2
>>> random.choice(indices)
0
>>> random.choice(indices)
2
这很好,但是如果'list'很长,它会有点低效。 (它会查看所有值以确定最大值,然后再次查看它们以找到匹配的索引。)仅供参考,不一定是批评。 – smarx
@smarx从计算复杂性的角度来看,它是*效率低下的,但是,由于'max'以C速度运行,对于中小型列表而言,开销可以忽略不计,并且必然会比以a *为*循环。 –
在我的情况下,它不应该是一个很大的问题,因为最大尺寸是10:D –
可能有更好的解决办法,但这里有一个相当“手工”的方式,应该是很容易了解:
import random
def get_random_max(classes):
maximum_indexes = []
maximum_value = None
for i, n in enumerate(classes):
if maximum_value is None or n > maximum_value:
maximum_value = n
maximum_indexes = [i + 1]
elif n == maximum_value:
maximum_indexes.append(i + 1)
return random.choice(maximum_indexes)
print(get_random_max([5, 2, 5])) # prints 1 or 3 with equal probability
感谢您的回答,它帮助我理解了问题背后的逻辑! –
要澄清,你真的需要随机选择其中之一? (这不是,例如,只是返回第一个最大值的索引是可以的?) – smarx
@smarx是的,正好。如果我总是返回第一个,那么class1在我的结果中会过多。 (我正在实施KNN算法) –