Скажем, у нас есть список:
a = [4, 8, 1, 7, 3, 0, 5, 2, 6, 9]
Теперь, a.sort () отсортирует список на месте. Что, если мы хотим отсортировать только часть списка, все еще на месте? В C++ мы могли записать:
int array = { 4, 8, 1, 7, 3, 0, 5, 2, 6, 9 };
int * ptr = array;
std::sort( ptr + 1, ptr + 4 );
В Python существует ли похожий способ?
если
является массивом numpy
, то для сортировки [i, j)
диапазона на месте введите:
a[i:j].sort()
Пример:
>>> import numpy as np
>>> a = np.array([4, 8, 1, 7, 3, 0, 5, 2, 6, 9])
>>> a[1:4].sort()
>>> a
array([4, 1, 7, 8, 3, 0, 5, 2, 6, 9])
Исходя из ваших требований, я бы предложил создать вашу собственную функцию сортировки / класс-оболочку для списка с функцией сортировки, которая удовлетворяет вашим требованиям.
Вы можете рассмотреть идиому DSU или преобразование Шварца: см. http://wiki.python.org/moin/HowTo/Sorting и http://wiki.python.org/ moin / PythonSpeed / PerformanceTips . Я предлагаю вам украсить 0 до i, элемент между i и j и снова 0 j и далее. Затем используйте пользовательскую функцию сравнения, чтобы вернуть 0, если либо x, либо y равно нулю, сортировка работает! Это может не помочь, так как мы уже давно пересекли Python V2.4. Тем не менее, это может быть то, что вы ищете.
Этот ответ наполняет меня, пока я пытаюсь понять, можно ли это сделать с меньшими усилиями!
Я бы написал так:
a[i:j] = sorted(a[i:j])
Это тоже не сортировка на месте, но достаточно быстрая для относительно небольших сегментов.
Обратите внимание, что Python копирует только ссылки на объекты, поэтому потеря скорости не будет такой большой по сравнению с реальной сортировкой на месте, как можно было бы ожидать.