найти верхний k самый большой элемент списка в исходном порядке в python - PullRequest
3 голосов
/ 24 сентября 2019

скажем, у меня есть следующий список:

my_list = [3.5, 1.6, 2.4, 8.9, 5.6]

Я хочу найти 3 самых больших числа в их первоначальном месте, поэтому результат должен быть:

[3.5, 8.9, 5.6]

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

Ответы [ 5 ]

3 голосов
/ 24 сентября 2019

Используйте кучу :

>>> import heapq
>>> heapq.nlargest(3, my_list)
[8.9, 5.6, 3.5]

Добавьте немного блеска к той же идее, чтобы сохранить их в первоначальном порядке:

>>> from operator import itemgetter
>>> i_val = heapq.nlargest(3, enumerate(my_list), key=itemgetter(1))
>>> [val for (i, val) in sorted(i_val)]
[3.5, 8.9, 5.6]
2 голосов
/ 24 сентября 2019

Вы можете отсортировать пары индекс-значение (сгенерированные enumerate) по значению, получить последние три пары, а затем отсортировать их по индексу (а затем получить только значения из пар индекс-значение, всеэто в понимании однострочного списка):

from operator import itemgetter

my_list = [3.5, 1.6, 2.4, 5.6, 8.9]

result = [p[1] for p in sorted(sorted(enumerate(my_list), key = itemgetter(1))[-3:], key = itemgetter(0))]

print(result)

Вывод:

[3.5, 5.6, 8.9]
1 голос
/ 24 сентября 2019

Как насчет этого?

[m for m in my_list if m in sorted(my_list)[-3:]]

Вы создаете новый список 'm' предметов из первых 3 предметов.Понимание списка держит ваши предметы в порядке.

Порядок вашего примера таков, что вы можете просто отсортировать его и взять 3 верхних предмета, но я думаю, вы имеете в виду, что у вас могут быть 3 верхних предмета НЕ впорядок, например:

my_list = [3.5, 1.2, 0.3, 7.8, 3.3]

, что приводит к

[3.5,7.8,3.3]
1 голос
/ 24 сентября 2019

Итак, вы можете попробовать эту функцию:

my_list = [3.5, 1.6, 2.4, 5.6, 8.9]
def select_top(a,array):
    new_list = []
    extra_list = []
    for i in range(len(my_list)):
        extra_list.append(my_list[i])
    final_list = []
    for i in range(a):
        new_list.append(extra_list.index(max(extra_list)))
        extra_list.pop(extra_list.index(max(extra_list)))
    new_list = sorted(new_list,reverse=False)
    for i in new_list:
        final_list.append(array[i])
    return final_list
print(select_top(3,my_list))

Я считаю, что это далеко не оптимально, но вы можете настроить его столько, сколько хотите, чтобы получить k верхних чисел и получить ихвернулся в исходном порядке.Выход:

[3.5, 5.6, 8.9]
0 голосов
/ 24 сентября 2019

Вот мой собственный ответ, он работает для проблемы.

my_list = [3.5, 1.6, 2.4, 8.9, 5.6]
top_k = sorted(my_list)[-3:]
result = list(filter(lambda x : x in top_k,my_list))
print(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...