如何在 Python 中就地对整数数组进行排序?

Posted

技术标签:

【中文标题】如何在 Python 中就地对整数数组进行排序?【英文标题】:How to sort an integer array in-place in Python? 【发布时间】:2011-07-29 05:59:23 【问题描述】:

如何在 Python 2.6 中对整数数组(不是列表)进行就地排序?标准库中是否有合适的函数?

换句话说,我正在寻找可以执行以下操作的函数:

>>> a = array.array('i', [1, 3, 2])
>>> some_function(a)
>>> a
array('i', [1, 2, 3])

提前致谢!

【问题讨论】:

为什么排除使用列表?你有没有分析并发现它缺乏?如果必须使用数组并且需要对其进行排序,我建议使用 numpy,它具有数组的排序方法。 @Steven 是的,我已经对其进行了分析。我正在研究几乎不适合 RAM 的大量整数。整数列表至少比整数数组大 3 倍,所以我不能使用它们。您(或其他任何人)能否指出 SciPy/NumPy 中的相关函数? 从docs.scipy.org/doc/numpy/reference/routines.sort.html 开始。请注意,默认排序返回一个副本,但 ndarray.sort 就地排序。 (我没有使用 SciPy/NumPy 的经验,但我知道它备受推崇且高度优化。) 【参考方案1】:

嗯,你不能用array.array来做,但你可以用numpy.array

In [3]: a = numpy.array([0,1,3,2], dtype=numpy.int)

In [4]: a.sort()

In [5]: a
Out[5]: array([0, 1, 2, 3])

或者你可以直接从array.array 转换,如果你已经有的话:

a = array.array('i', [1, 3, 2])
a = numpy.array(a)

【讨论】:

这似乎是一种就地排序。很好的答案。【参考方案2】:

查看array docs,我没有看到排序的方法。我认为以下内容与使用标准函数一样接近,尽管它确实用同名的新对象破坏了旧对象:

import array
a = array.array('i', [1,3,2])
a = array.array('i', sorted(a))

或者,你可以自己写。

从 cmets 获得的额外信息表明您正在最大化内存,这似乎不适用于您的情况; numpy 解决方案是要走的路。不过,我会把它留作参考。

【讨论】:

【参考方案3】:

@steven 提到了 numpy。

Copies vs. in-place operation
-----------------------------
Most of the functions in `numpy` return a copy of the array argument
(e.g., `sort`).  In-place versions of these functions are often
available as array methods, i.e. ``x = np.array([1,2,3]); x.sort()``.
Exceptions to this rule are documented.

【讨论】:

以上是关于如何在 Python 中就地对整数数组进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

Java:就地对 ArrayList 进行排序

无痕就地选择排序

对一个 n 元素数组进行排序,使前 k 个元素按升序排列最低(就地算法)

线性时间和就地排序

如何就地对文件进行排序

如何对在python中存储为字符串的整数列表进行排序[重复]