Сортировка части списка на месте
Скажем, у нас есть список:
a = [4, 8, 1, 7, 3, 0, 5, 2, 6, 9]
Теперь, a.sort() сортирует список на месте. Что делать, если мы хотим отсортировать только часть списка, все еще на месте? В С++ мы могли бы написать:
int array = { 4, 8, 1, 7, 3, 0, 5, 2, 6, 9 };
int * ptr = array;
std::sort( ptr + 1, ptr + 4 );
Есть ли аналогичный способ в Python?
Ответы
Ответ 1
Я бы написал так:
a[i:j] = sorted(a[i:j])
Он не является также неместным, но достаточно быстрым для относительно небольших сегментов.
Обратите внимание, что Python копирует только ссылки на объекты, поэтому ограничение скорости не будет таким огромным по сравнению с реальным видом на месте, как можно было бы ожидать.
Ответ 2
если 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])
Ответ 3
Существует еще один простой подход. У вас есть массив
a = [4, 8, 1, 7, 3, 0, 5, 2, 6, 9]
и вы хотите отсортировать часть этого массива, скажем, от индекса 2 до индекса 7 в индексе на основе нуля, то есть от элемента 1 до 2.
b = a[2:7+1]
b.sort()
a[2:7+1] = b
Ответ 4
В соответствии с вашими требованиями я бы предложил создать свою собственную функцию сортировки/класс-оболочку для списка с функцией сортировки, которая соответствует вашему требованию.
Вы можете рассмотреть идиому DSU или преобразование шварца: См. http://wiki.python.org/moin/HowTo/Sorting и http://wiki.python.org/moin/PythonSpeed/PerformanceTips.
Я предлагаю вам украсить 0 до i, элемент между я и j и 0 снова j вперед.
Затем используйте пользовательскую функцию сравнения, чтобы вернуть 0, если x или y равно нулю, чтобы сортировка работала! Это может не помочь, поскольку мы давно перешли Python V2.4. Тем не менее, это может быть то, что вы ищете.
Этот ответ заполняется, когда я пытаюсь выяснить, можно ли это сделать с меньшими усилиями!
Ответ 5
Вот ссылка из python wiki
В принципе, sorted(list)
создает новый отсортированный список, однако метод list.sort()
может помочь вам в сортировке на месте.
>>> list = [(3, 5), (4, 7), (1, 5)]
>>> sorted(list)
[(1, 5), (3, 5), (4, 7)]
>>> list.sort()
[(1, 5), (3, 5), (4, 7)]
Ответ 6
Более pythonic решение может быть:
# i,j = range to sort.
a = a[:i] + sorted(a[i:j]) + a[j:]
Это не сортируется "на месте", но это кажется искусственным требованием. Рад слышать, почему это может быть требованием.;)
Ответ 7
Вы можете просто использовать сортировку метода списка, например.
>>> a = [2,3,1]
>>> a.sort()
>>> a
[1, 2, 3]