提取列表中n个最高值的索引

时间:2018-09-13 02:08:26

标签: python list

将与另一个列表的n个最大值对应的索引提取到列表中,同时保留要从中提取索引的列表的最有效方法是什么?

例如,假设我们有以下索引列表:

foo = [107,6,34,12,82]

如果我们请求列表foo的2个最大值的索引,它将返回以下列表:

bar = [0,4]

这是我现在正在运行的内容,它的效率很低而且一点也不优雅,我也不知道如何改进它:

foo = [107, 6, 34, 12, 82]
tmp = list(foo)
bar = []
no_of_indices_wanted = int(input())
for n in range(no_of_indices_wanted):
    bar.append(foo.index(max(foo)))
    foo.pop(foo.index(max(foo)))
foo = tmp

4 个答案:

答案 0 :(得分:2)

您可以使用enumerate来标注每个项目的索引,然后使用heapq.nlargest获取列表中的前两个,然后将索引提取到列表中:

import heapq
from operator import itemgetter
print(list(map(itemgetter(0), heapq.nlargest(2, enumerate(foo), key=itemgetter(1)))))

这将输出:[0, 4]

答案 1 :(得分:1)

另一种方法是:

foo = [107,6,34,12,82]
n=2
[i for i, x in sorted(enumerate(foo), key=lambda x: -x[1])[:n]]
#[0, 4]

答案 2 :(得分:0)

您可以对 let approvedColor: UIColor = UIColor(red: 19/255, green: 195/255, blue: 30/255, alpha: 1.0) let pendingColor: UIColor = UIColor(red: 255/255, green: 148/255, blue: 56/255, alpha: 1.0) let rejectedColor: UIColor = UIColor(red: 225/255, green: 74/255, blue: 74/255, alpha: 1.0) let surveyData = [50,40,10] func fillChart() { var dataEntries = [PieChartDataEntry]() for (val) in surveyData { let entry = PieChartDataEntry(value: Double(val), label: nil) dataEntries.append(entry) } let chartDataSet = PieChartDataSet(values: dataEntries, label: "") chartDataSet.colors = [approvedColor,pendingColor,rejectedColor] chartDataSet.sliceSpace = 0 chartDataSet.selectionShift = 5 let chartData = PieChartData(dataSet: chartDataSet) chartView.data = chartData } 的元组进行排序,然后恢复索引。

(value, index)

输出

def n_highest(lst, n):
    ordered = sorted([(value, idx) for idx, value in enumerate(lst)], reverse=True)
    return [idx for value, idx in ordered[:n]]

print(n_highest([107, 6, 34, 12, 82], 2))

答案 3 :(得分:-1)

您也可以使用以下方法:

myList=[1,50,30,15,14]
sorted_ind_list=[]

for a in sorted((e,i) for i,e in enumerate(myList)):
   sorted_ind_list.append(a[1])

print(sorted_ind_list[0:2])

sort在堆上具有更好的性能。

comparison