Сортировать часть списка на месте - PullRequest
34 голосов
/ 16 февраля 2010

Допустим, у нас есть список:

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?

Ответы [ 3 ]

49 голосов
/ 16 февраля 2010

Я бы написал так:

a[i:j] = sorted(a[i:j])

Это не сортировка по месту, но достаточно быстрая для относительно небольших сегментов.

Обратите внимание, что Python копирует только ссылки на объекты, поэтому снижение скорости не будет таким огромным по сравнению с реальной сортировкой на месте, как и следовало ожидать.

20 голосов
/ 16 февраля 2010

если a - массив 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])
0 голосов
/ 16 февраля 2010

Исходя из ваших требований, я бы предложил создать собственную функцию сортировки / класс-обертку для списка с функцией сортировки, которая соответствует вашим требованиям.

Вы можете рассмотреть идиому 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. Тем не менее, это может быть то, что вы ищете.

Этот ответ заполняется, пока я пытаюсь понять, можно ли это сделать с меньшими усилиями!

...