2017-10-13 65 views
4

我的程序计算的时间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末是返回实际的类标签,而不是指数。)

+0

要澄清,你真的需要随机选择其中之一? (这不是,例如,只是返回第一个最大值的索引是可以的?) – smarx

+0

@smarx是的,正好。如果我总是返回第一个,那么class1在我的结果中会过多。 (我正在实施KNN算法) –

回答

6

可以使用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 
+1

这很好,但是如果'list'很长,它会有点低效。 (它会查看所有值以确定最大值,然后再次查看它们以找到匹配的索引。)仅供参考,不一定是批评。 – smarx

+0

@smarx从计算复杂性的角度来看,它是*效率低下的,但是,由于'max'以C速度运行,对于中小型列表而言,开销可以忽略不计,并且必然会比以a *为*循环。 –

+0

在我的情况下,它不应该是一个很大的问题,因为最大尺寸是10:D –

4

可能有更好的解决办法,但这里有一个相当“手工”的方式,应该是很容易了解:

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 
+0

感谢您的回答,它帮助我理解了问题背后的逻辑! –

相关问题