Python индекс отсортированного списка с последовательным индексом для запусков единиц

#python #list #sorting

#python #Список #сортировка

Вопрос:

У меня есть список Python, и я хочу найти индекс элементов отсортированного списка. Но мне нужно, чтобы индекс запусков единиц был последовательным.

Я пишу следующий код:

 import numpy as np
lst = [0., 0., 0., 0., 0., 1., 1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0.,]
arr = np.array(lst)
print(arr.argsort()[::-1])
  

Результат таков

 [ 9  8  5  6 11 10  7  1  2  3  4 19 18 12 13 14 15 16 17  0]
  

Но я ожидаю чего-то вроде:

 [5 6 7 8 9 10 11 0 1 2 3 4 12 13 14 15 16 17]
  

или

 [11 10 9 8 7 6 5 0 1 2 3 4 12 13 14 15 16 17]
  

Индекс запусков единиц должен быть последовательным в выходных данных. Какова реализация этой идеи на pythonic?

Ответ №1:

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

 lst = [0., 0., 0., 0., 0., 1., 1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0.]
idxs = [x[0] for x in sorted(enumerate(lst), key=lambda v:-v[1])]
print(idxs)
  

Вывод:

 [5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 12, 13, 14, 15, 16, 17]