问题描述
我正在尝试运行以下代码,但在“右侧:无”之后显示错误, 应该说“右边:[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.