2016-04-13 7 views
0

У меня есть простой список:В Python, как я могу получить индексы из 5 самых больших значений списка?

a = [8, 5, 2, 20, 13, 14, 17, 13, 15, 21] 

я могу получить 5 наибольших значений в списке:

sorted(a)[-5:] 

Как я мог получить индексов из 5 наибольших значений в списке?

Таким образом, 5 наименований наибольшего значения - [14, 15, 17, 20, 21], и они указаны по индексу [9, 3, 6, 8, 5]. Я уверен, что существует множество стратегий, которые следует учитывать, если есть повторяющиеся значения, которые можно указать, если они находятся рядом с другими великими значениями.

+0

Просто для полноты картины, пожалуйста, добавить, что ваш ожидаемый результат будет. Это даст вам [mcve], который является предпочтительным. –

ответ

6

Вы можете попробовать это:

[x[0] for x in sorted(enumerate(a), key=lambda x: x[1])[-5:]] 
+0

Определенно лучше, так как он может заботиться о значениях обмана. –

0

Вы можете сделать:

[a.index(x) for x in sorted(a)[-5:]] 

Посетите документы и проверить функцию index.

+0

Кто помет, как плохо? Что не так с этим решением? – sedavidw

+0

@sedavidw Я действительно удивляюсь .. это плохо и грустно. Я не могу понять свою ошибку без объяснения нисходящего потока. – Maroun

+2

'.index (x)' является неэффективным и неправильным в случае дубликатов. Хотя я не уменьшал ни одного слова. – freakish

0

len(sorted(a)) - 1 Это даст вам индекс самого большого элемента.

len(sorted(a)) - 2 затем даст вам второй по величине элемент и так далее

+0

, но только отсортированный массив ... – MSeifert

0

Ну, что частично зависит от того, если у вас есть повторяющиеся значения в списке.

Если нет повторяющихся значений, я думаю, что самый простой ответ заключается в том, чтобы получить максимальные значения в том виде, в котором вы упомянули, а затем для каждого из них найти индекс этого значения с помощью метода списков index: [1,2,3].index(3)

0

Короткий ответ:

map(itemgetter(0), sorted(enumerate(lst), key=itemgetter(1), reverse=True))[:5] 

в функции:

from operator import itemgetter 

def get_top_indices(lst, qnt=5): 
    return map(itemgetter(0), sorted(enumerate(lst), key=itemgetter(1), reverse=True))[:qnt] 

Пример:

>>> get_top_indices([8, 5, 2, 20, 13, 14, 17, 13, 15, 21]) 
[9, 3, 6, 8, 5] 
0
a = [8, 5, 2, 20, 13, 14, 17, 13, 15, 21] 
b = sorted(a)[-5:] 

c = [i for i , x in enumerate(a) if x in b]