如何清理 Python 中的这个选择排序函数?

How can I clean up this Selection Sort function in Python?

我刚刚将一个用 C++ 编写的选择排序函数转换为 Python。

我觉得我编写代码的方式太像 C 程序员了,而我知道 Python 有许多内置函数可以与 for 循环一起使用来清理它。我只是不确定从哪里开始。

我可以更改此代码中的哪些内容以使其更加地道?

def selection_sort(A):
    for i in range(0, len(A) - 1):
        min_idx = i
        for j in range(i + 1, len(A)):
            if A[j] < A[min_idx]:
                min_idx = j
        if min_idx != i:
            A[i], A[min_idx] = A[min_idx], A[i]

    return A

代码实际上看起来已经很 pythonic 了!值得注意的是,您使用 x, y = y, x 习语交换值,这在 Python.

中受到高度鼓励

Python2 和 Python3:

  • range(0, x) 等同于 range(x)
  • 可选地,您可以使用 A.index(min(A[i:])) 查找最小值索引。这在很大程度上取决于口味,对于非常大的列表,它会变慢。恕我直言,看起来简洁明了:
def selection_sort(A):
    for i in range(0, len(A) - 1):
        min_idx = A.index(min(A[i:]))
        if min_idx != i:
            A[i], A[min_idx] = A[min_idx], A[i]

    return A

Python2:

  • range 创建一个列表 - 遍历所有元素 - 立即,xrange 创建一个惰性生成器 - 仅在需要时才遍历元素 - 它是首选并且通常更快(在您提供的代码段中并没有更快。

一般:

  • 在专业的代码审查中,您可能需要提供文档字符串,大致类似于:
def selection_sort(A):
    """selection_sort performs an unstable in-place sort on A

    A -- list to be sorted.

    Returns A, sorted.
    """
    for i in range(0, len(A) - 1):
        min_idx = i
        for j in range(i + 1, len(A)):
            if A[j] < A[min_idx]:
                min_idx = j
        if min_idx != i:
            A[i], A[min_idx] = A[min_idx], A[i]

    return A

来源: