2016-05-24 68 views
4

我在解決此問題時遇到了一些麻煩。獲取多個列表中的最小值的唯一索引

假設我有n個包含n個元素的列表。 對於每個列表,我需要找到最小值的索引並將它們存儲在一個新列表中。這很簡單。

問題是,我的索引列表中的兩個或多個值可能相等。我需要一個具有唯一值的列表。如果兩個(或更多)值相等,我想優先考慮來自最小值的索引值。

例子:

myLists = [] 
myLists.append([113.6, 12262.6, 21466.7, 141419.9])  # list 1 
myLists.append([122284.8, 111161.8, 106581.1, 141419.9]) # list 2 
myLists.append([25427.9, 13694.0, 5148.9, 141419.9])  # list 3 
myLists.append([21354.9, 10599.2, 0.1, 141419.9])  # list 4 

這會給我的索引列表[0,2,2,2]。根據列表2,3和4中的第二個值,我看到列表4中的最小值,所以我的索引列表應該看起來像[0,?,?,2]。

更進一步,我需要填寫值爲1和3的問號,但哪個去哪?從檢查中我看到,由於13694.0(列表3中的索引1)小於111161.8(列表2中的索引1)並且每個列表中的第三個索引值相等,所以我應該從列表3中選擇索引1.

這意味着我的新索引列表是[0,?,1,2]。只剩下一個問號,我用3填充。這給出[0,3,1,2]。

這些列表大多數都很小,所以運行時間並不是真正的問題。

回答

4

我合併了3個成員元組形式的所有列表(值,myLists中的列表索引,列表中的值索引)並按值排序。我的代碼的時間複雜度爲nlog(n)

myLists = [] 
myLists.append([113.6, 12262.6, 21466.7, 141419.9]) # list 1 
myLists.append([122284.8, 111161.8, 106581.1, 141419.9]) # list 2 
myLists.append([25427.9, 13694.0, 5148.9, 141419.9]) # list 3 
myLists.append([21354.9, 10599.2, 0.1, 141419.9]) # list 4 

merged_list = list() 

for index1, ls in enumerate(myLists): 
    for index2, x in enumerate(ls): 
     merged_list.append((x, index1, index2)) 

merged_list.sort() 

st = set() #to store already added indices 

res = [-1 for i in range(len(myLists))] 

for x, y, z in merged_list: 
    if res[y] != -1 or z in st: 
     continue 
    res[y] = z 
    st.add(z) 

print(res) 

輸出 -

[0, 3, 1, 2] 
相關問題