Извлечь индексы из n самых высоких значений в списке - PullRequest
0 голосов
/ 13 сентября 2018

Каков наиболее эффективный способ извлечения в список индексов, соответствующих n максимальным значениям другого списка, при сохранении списка, из которого мы извлекаем индексы?

Например, допустим, у нас есть следующий список индексов:

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

Если мы запросили индексы 2 самых высоких значений списка foo, он должен вернуть нам следующий список:

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 голосов
/ 13 сентября 2018

Вы можете отсортировать кортежи по (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]
0 голосов
/ 13 сентября 2018

Вы также можете использовать следующий подход:

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

сортировка имеет лучшую производительность по сравнению с кучей.

Сравнение

0 голосов
/ 13 сентября 2018

Другой подход будет:

foo = [107,6,34,12,82]
n=2
[i for i, x in sorted(enumerate(foo), key=lambda x: -x[1])[:n]]
#[0, 4]
0 голосов
/ 13 сентября 2018

Вы можете использовать enumerate для аннотирования индексов для каждого элемента, а затем использовать heapq.nlargest для получения двух старших в списке, после чего вы извлекаете индексы в список:

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

Это выводит: [0, 4]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...