Отсортируйте часть списка на месте

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

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 существует ли похожий способ?

39
задан Sнаđошƒаӽ 27 April 2016 в 04:49
поделиться

3 ответа

если является массивом 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])
21
ответ дан 27 November 2019 в 02:32
поделиться

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

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

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

-1
ответ дан 27 November 2019 в 02:32
поделиться

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

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

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

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

55
ответ дан 27 November 2019 в 02:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: