Вот более эффективный способ, сначала отсортировав список, который делает процесс O (n * log (n)) вместо O (n ** 2).
Мы сортируем список, сохраняя исходный индекс каждого значения (это O (n * log (n)).
Затем мы переходим один раз по списку, чтобы установить количество выходов, которые являются индексами значений в отсортированном списке, за исключением дубликатов - в этом случае мы просто отслеживаем количество одинаковых значений для настройки результат.
def larger_than(values):
ordered_values = sorted((value, index) for index, value in enumerate(values))
out = [None] * len(values)
# take care of equal values
equals = 0
prev = None
for rank, (value, index) in enumerate(ordered_values):
if value == prev:
equals += 1
else:
equals = 0
prev = value
out[index] = rank - equals
return out
Некоторые тесты:
values = [1, 4, 3, 3, 10, 1, 5, 2, 7, 6]
print(larger_than(values))
# [0, 5, 3, 3, 9, 0, 6, 2, 8, 7]