我有以下列表
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]
我需要找到其他最佳解决方案。
答案 0 :(得分:0)
您可以使用numpy
(numpy
个数组非常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)
更快。