查找列表中所有最大值索引的最快方法-Python

时间:2019-05-08 03:57:28

标签: python-3.x collections itertools

我有以下列表

input_list= [2, 3, 5, 2, 5, 1, 5]

我想获取所有最大值的索引。需要有效的解决方案。输出如下。

output = [2,4,6] (The above list 5 is maximum value in a list)

我尝试使用下面的代码

m = max(input_list)
output = [i for i, j in enumerate(a) if j == m]

我需要找到其他最佳解决方案。

5 个答案:

答案 0 :(得分:0)

您可以使用numpynumpy个数组非常fast):

import numpy as np
input_list= np.array([2, 3, 5, 2, 5, 1, 5])
i, = np.where(input_list == np.max(input_list))
print(i)

输出:

[2 4 6]

答案 1 :(得分:0)

O(n)使用for循环,并在列表解析范围内进行一次迭代:

from itertools import islice

input_list= [2, 3, 5, 2, 5, 1, 5]

def max_indexes(l):
    max_item = input_list[0]
    indexes = [0]
    for i, item in enumerate(islice(l, 1, None), 1):
        if item < max_item:
            continue
        elif item > max_item:
            max_item = item
            indexes = [i]
        elif item == max_item:
            indexes.append(i)
    return indexes

这里有live example

答案 2 :(得分:0)

 from collections import defaultdict
 dic=defaultdict(list)
 input_list=[]
 for i in range(len(input_list)):
         dic[input_list[i]]+=[i]

 max_value = max(input_list)

 Sol = dic[max_value]

答案 3 :(得分:0)

这是注释中描述的方法。即使您使用某些库,从根本上讲,您也至少需要遍历一次才能解决此问题(considering input list is unsorted)。因此,该算法的下限甚至是Omega(size_of_list)。如果列表已排序,我们可以利用binary_search来解决问题。

def max_indexes(l): 
     try: 
         assert l != [] 
         max_element = l[0] 
         indexes = [0] 
         for index, element in enumerate(l[1:]): 
             if element > max_element: 
                 max_element = element 
                 indexes = [index + 1] 
             elif element == max_element: 
                 indexes.append(index + 1) 
         return indexes 
     except AssertionError: 
         print ('input_list in empty')

答案 4 :(得分:0)

以这种方式考虑,除非您遍历整个列表一次,即O(n),n是列表的长度,否则将无法将最大值与列表中的所有值进行比较。列表,因此最好的方法是O(n),在您的示例中您似乎已经做到了。

因此,我不确定使用列表方法可以比O(n)更快。