Сортировка части списка на месте

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

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]