如何在Python中清理此选择排序函数?

时间:2019-05-10 06:52:56

标签: python sorting refactoring selection-sort

我刚刚经历了一次,并将用C ++编写的Selection Sort函数转换为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

2 个答案:

答案 0 :(得分:0)

列表具有sort()函数,可以为您完成工作。

答案 1 :(得分:0)

该代码实际上看起来已经非常具有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

来源: