【问题标题】:Attempting a quicksort, returns TypeError.尝试快速排序,返回 TypeError。
【发布时间】:2014-03-02 21:29:06
【问题描述】:
names = ['James','Adam','Ross','Bryce','Sue','Matt','Chris','Sarah','Rachel','Aron']

def sort(names):
    less = []
    equal = []
    greater = []
    if len(names) > 1:
        pivot = names[0]
        for x in names:
            if x < pivot:
                str(less.append(x))
            elif x == pivot:
                str(equal.append(x))
            elif x > pivot:
                str(greater.append(x))
        return sort(less) + sort(equal) + sort(greater)
    else:
        if len(names) == 1:
            return names                            
print sort(names)

每当我运行它时,它都会返回此错误:

TypeError: unsupported operand type(s) for +: 'NoneType' and 'list'. 

谁能告诉我这是怎么回事?我对 Python 很陌生

【问题讨论】:

  • 只是一个提示,因为您的 equal 列表中的所有内容都等于枢轴,它不需要排序,并且可以简单地添加到中心,这样您就有 return sort(less) + equal + sort(greater)
  • 另一个提示,快速排序具有“就地”排序的优势。因此可以通过交换值在单个列表中完成。相比之下,这段代码在递归发生时会创建大量新列表。

标签: python list sorting nonetype


【解决方案1】:

您正在尝试将列表添加到 None 类型,如错误所示。它发生在您拥有的代码示例的第 16 行。

但是让我们看看这些行:

pivot = names[0]
for x in names:
    if x < pivot:
        str(less.append(x))

既然你说你是 Python 新手,那我来解释一下。当您说x &lt; pivot 时,您不是在询问它是否在列表中,而是在进行字典比较。例如,在 Python 中,我们有:

>>> 'a' < 'b'
True

其次,str(less.append(x)) 也不做任何事情。您要求它从列表操作中创建一个字符串。它将返回 None 类型。像这样:

>>> less = []
>>> str(less.append('hi'))
'None'

所以,最后,问题是你的函数什么都不返回,因为当列表长度为 0 时你没有考虑到。

【讨论】:

    【解决方案2】:

    您应该检查 0 尺寸列表:

    names = ['James','Adam','Ross','Bryce','Sue','Matt','Chris','Sarah','Rachel','Aron']
    
    def sort(names):
        less = []
        equal = []
        greater = []
        if len(names) > 1:
            pivot = names[0]
            for x in names:
                if x < pivot:
                    str(less.append(x))
                elif x == pivot:
                    str(equal.append(x))
                elif x > pivot:
                    str(greater.append(x))
            return sort(less) + sort(equal) + sort(greater)
        else:
            if len(names) == 1 or len(names) == 0:
                return names            
    
    print sort(names)
    

    【讨论】:

    • 这很重要,因为在某些情况下sort 会以空列表作为参数被调用。发生这种情况时,原始代码会返回“NoneType”而不是列表。该结果+与返回正确列表的其他结果导致错误。
    【解决方案3】:

    对一个空列表(在这种情况下为less)进行排序,返回None

    【讨论】:

      【解决方案4】:

      与 python 中的所有函数一样,您的 sort 函数在未明确返回某些内容时返回 None。由于您是 python 新手,请先尝试在 IDE 中使用列表,然后执行您的算法。

      some_list = [1,2,3,4]
      an_index = some_list.index(1)
      some_list.append(5) #adding at the end of list
      

      文档是一个很好的起点:http://docs.python.org/2/tutorial/datastructures.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-27
        • 1970-01-01
        • 1970-01-01
        • 2020-08-14
        • 1970-01-01
        • 2016-12-23
        相关资源
        最近更新 更多