Как заменить все элементы в списке их порядком в python? - PullRequest
2 голосов
/ 17 апреля 2020

Давайте возьмем этот список:

L = [8,1,4,2]

Я хотел бы заменить его элементы на их порядок.
Ожидаемый результат:

[4,1,3,2]

Следующий скрипт работает, но на самом деле неэффективно с двойным для l oop:

L_result = []
for i in L :
    order = 1
    for j in L :
        if i > j :
            order += 1
    L_result.append(order)

1 Ответ

3 голосов
/ 17 апреля 2020

Использовать отсортировано + перечислять :

L = [8, 1, 4, 2]

positions = {e: i for i, e in enumerate(sorted(L), 1)}
result = [positions[e] for e in L]

print(result)

Вывод

[4, 1, 3, 2]

Этот подход O(n log n) так как сортирует массив. Если L имеет дублирующиеся значения, вы можете сделать следующее:

from collections import defaultdict, deque

L = [8, 1, 4, 8, 2]

positions = defaultdict(deque)
for i, e in enumerate(sorted(L), 1):
    positions[e].append(i)

result = [positions[e].popleft() for e in L]

print(result)

Вывод

[4, 1, 3, 5, 2]

Причина использования deque для обеспечения стабильности ордера, первые 8 занимают первую позицию, сохраняя при этом операцию popleft O(1), поэтому алгоритм остается O(n log n).

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