TypeError:对象具有nonetype'len并停止迭代

问题描述

我正在尝试运行以下代码,但在“右侧:无”之后显示错误, 应该说“右边:[2,4]”

data =  [9,5,7,4,2,8,1,10,6,3]

def mergeSort(list):
    if len(list) < 2:
        return list
    
    middle = len(list)//2 
    
    #Break the list in 2 pieces
    left = mergeSort(list[:middle])
    right = mergeSort(list[middle:])
    
    print("Left side: ",left)
    print("Right side: ",right)
    
    
    merged = merge(left,right)
    print("Merged",merged)
    return merged
    
def merge(left,right):

    if not len(left):
        return left
    if not len(right):
        return right 

    result = []
    leftIndex = 0
    rightIndex = 0 
    totalLen = len(left) + len(right)


    while (len(result) < totalLen):
        if left[leftIndex] < right[rightIndex]:
            result.append(left[leftIndex])
            leftIndex+= 1
        else: 
            result.append(right[rightIndex])
            rightIndex+= 1 
      
        if leftIndex == len(left) or \
            rightIndex == len(right):
                result.extend(left[leftIndex:]
                             or right[rightIndex:])
                break
        return result
        
mergeSort(data)

代码可用于前几次迭代,但会停止并给出错误类型:'nonetype'没有len()。

追踪

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-66-50291ed7231f> in <module>
     47         return result
     48 
---> 49 mergeSort(data)

<ipython-input-66-50291ed7231f> in mergeSort(list)
      8 
      9     #Break the list in 2 pieces
---> 10     left = mergeSort(list[:middle])
     11     right = mergeSort(list[middle:])
     12 

<ipython-input-66-50291ed7231f> in mergeSort(list)
      9     #Break the list in 2 pieces
     10     left = mergeSort(list[:middle])
---> 11     right = mergeSort(list[middle:])
     12 
     13     print("Left side: ",left)

<ipython-input-66-50291ed7231f> in mergeSort(list)
     15 
     16 
---> 17     merged = merge(left,right)
     18     print("Merged",merged)
     19     return merged

<ipython-input-66-50291ed7231f> in merge(left,right)
     23     if not len(left):
     24         return left
---> 25     if not len(right):
     26         return right
     27 

TypeError: object of type 'nonetype' has no len()

解决方法

尝试将合并功能更改为此

def merge(left,right):
    result = []
    for elem in left:
        if elem < right[0]:
            result.append(elem)
        else:
            result.append(right.pop(0))
    return result + right
,

您在mergeSort()中进行了一些诊断打印,但是问题出在merge()中。

    if not len(left):
        return left                # Should be right.
    if not len(right):
        return right               # Should be left.

    while (len(result) < totalLen):
        if ...
            ...
        else ...
            ...
        if ...
            ...
            break
        return result              # Should be outside the while loop.