将与另一个列表的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
答案 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在堆上具有更好的性能。