Сортировка абсолютных значений на Питоне
Задана последовательность из n целых чисел. Ваша задача упорядочить числа по возрастанию их абсолютных значений. Если у двух чисел одинаковое абсолютное значение, но разные знаки, то первым должно идти отрицательное число.
Input
5
8 -9 3 3 -3
Output
-3 3 3 8 -9
Ответы (2 шт):
код:
max_value = max(abs(min(arr)), abs(max(arr)))
arr.sort(key=lambda i: abs(i) * max_value - (i < 0))
с питоном сложнее, чем с остальными языками, поскольку там с сортировкой похуже, поэтому можно применить такой ход
получать абсолютное значение сортируемого элемента
умножать его на абсолютное значение максимального элемента
это гарантирует, что два отличных элемента теперь будут отделены некоторой дельтой больше 1
- вычитать в случае отрицательного значения элемента из результата 2)
1
это гарантирует, что элемент с одинаковым абсолютным значением, но отрицательным знаком будет отсортирован левее, чем элемент с положительным знаком
P.S.
если сортируются не целые числа, а числа с плавающей запятой, то подход будет примерно тот же, только надо находить не максимальное значение, а минимальную дельту между элементами и дальше использовать схожий подход
Питон сравнивает списки лексикографически: если первые элементы не равны, то они определяют порядок, иначе вторые элементы и так до конца обоих списков. Воспользуемся этим, сравним пары вида (abs(v), v). Первый элемент пары отвечает за сортировку по абсолютной величине, второй упорядочивает числа одинаковые по абсолютной величине но разные по знаку:
a.sort(key=lambda v: (abs(v), v))
Тест:
@>>> a = [3, -9, 8, 0, -4, 2, -1, -5, -3, 6, 9, 1, 7, 0, -8, -2, 5, -7, 4, -6]
@>>> a.sort(key=lambda v: (abs(v), v))
@>>> a
[0, 0, -1, 1, -2, 2, -3, 3, -4, 4, -5, 5, -6, 6, -7, 7, -8, 8, -9, 9]