2017-10-13 85 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

感謝您的回答,它幫助我理解了問題背後的邏輯! –

相關問題