【问题标题】:Discrepancy while implementing quicksort in Python在 Python 中实现快速排序时的差异
【发布时间】:2017-01-10 17:53:06
【问题描述】:

这是我在 Python 中的快速排序实现:

def quicksort(alist):
    if len(alist) <= 1:
        return alist
    else:
        pivot = alist[len(alist)//2]
        alist.remove(pivot)
        alist1, alist2 = partition(alist, pivot)
        return quicksort(alist1) + [pivot] + quicksort(alist2)

def partition(alist, pivot):
    alist1 = []
    alist2 = []
    for e in alist:
        if e <= pivot:
            alist1.append(e)
        else:
            alist2.append(e)
    return (alist1, alist2)

此实现工作正常。但是看看第 6 行和第 7 行,它们分别是 alist.remove(pivot)alist1, alist2 = partition(alist, pivot)。如果我尝试通过如下重写第 7 行将这两行合并为一行代码:alist1, alist2 = partition(alist.remove(pivot), pivot),那么我的代码不起作用。我收到以下类型错误:

TypeError: 'NoneType' object is not iterable

想知道我为什么会遇到这个错误?

【问题讨论】:

  • 顺便说一句,remove 行完全没用,并且使代码大大变慢。重写 partition 以排除枢轴。

标签: python function methods quicksort


【解决方案1】:

remove 方法不返回修改后的列表,而在 python 中,如果一个函数不返回任何内容,它“返回”None

>>> a = [1, 2, 3]
>>> r = a.remove(2)
>>> r == None
True

【讨论】:

    【解决方案2】:

    alist.remove(pivot) 不返回实际列表,list.remove 在 Python 中返回 None

    【讨论】:

      【解决方案3】:

      您收到错误是因为 alist.remove(pivot) 没有返回列表。

      它不会返回任何内容 (None) 只是从您的列表中删除 pivot

      因此,您最终传递给您的 partition 方法是 Nonetype 对象而不是列表。

      【讨论】:

        猜你喜欢
        • 2018-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-02
        相关资源
        最近更新 更多