【问题标题】:Extract the indices of the n highest values in a list提取列表中 n 个最大值的索引
【发布时间】:2019-02-17 17:10:01
【问题描述】:

在保留我们从中提取索引的列表的同时,将对应于另一个列表的 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

【问题讨论】:

    标签: python list


    【解决方案1】:

    您可以使用enumerate对每个项目的索引进行注释,然后使用heapq.nlargest获取列表的最高两个,然后将索引提取到列表中:

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

    这个输出:[0, 4]

    【讨论】:

      【解决方案2】:

      您也可以使用以下方法:

      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])
      

      排序比堆有更好的性能。

      comparison

      【讨论】:

      • 这给出了最高的两个值,而不是 OP 要求的最高两个值的索引。
      【解决方案3】:

      另一种方法是:

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

      【讨论】:

      • 如果列表中没有两个相同的最高数字,这将起作用,这可能是也可能不是有效的假设。
      【解决方案4】:

      您可以对(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))
      

      输出

      [0, 4]
      

      【讨论】:

        猜你喜欢
        • 2016-04-25
        • 2022-06-13
        • 2013-07-11
        • 2017-09-25
        • 2019-08-31
        • 1970-01-01
        • 2022-01-05
        • 2022-01-26
        • 2018-10-26
        相关资源
        最近更新 更多