代码之家  ›  专栏  ›  技术社区  ›  Rayan Hatout

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

  •  2
  • Rayan Hatout  · 技术社区  · 6 年前

    在保留从中提取索引的列表的同时,向列表中提取与另一个列表的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 回复  |  直到 6 年前
        1
  •  2
  •   blhsing    6 年前

    你可以用 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
  •  1
  •   zipa    6 年前

    另一种方法是:

    foo = [107,6,34,12,82]
    n=2
    [i for i, x in sorted(enumerate(foo), key=lambda x: -x[1])[:n]]
    #[0, 4]
    
        3
  •  0
  •   Olivier Melançon iacob    6 年前

    你可以对元组进行排序 (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]
    
        4
  •  -1
  •   Jim Todd    6 年前

    您也可以使用以下方法:

    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