【发布时间】:2015-09-13 15:18:44
【问题描述】:
我目前正在尝试排序和合并列表的代码,但我无法让它工作:
def mergesort(L):
"""Returns a new sorted list with the same elements as L"""
print (L)
if len(L) < 2:
return L[:]
else:
middle = int(len(L) / 2)
left = mergesort(L[:middle])
right = mergesort(L[middle:])
together = merge(left,right)
print( 'merged', together)
return
会发生这样的事情:
>>> test = [1, 3, 5, 6, 4, 7, 20, 9]
>>> mergesort(test)
[1, 3, 5, 6, 4, 7, 20, 9]
[1, 3, 5, 6]
[1, 3]
[1]
[3]
merged [1, 3]
[5, 6]
[5]
[6]
merged [5, 6]
Traceback (most recent call last):
File "<pyshell#347>", line 1, in <module>
mergesort(test)
File "C:/Python27/python omg 2 samma/lec10.py", line 30, in mergesort
left = mergesort(L[:middle])
File "C:/Python27/python omg 2 samma/lec10.py", line 32, in mergesort
together = merge(left,right)
File "C:/Python27/python omg 2 samma/lec10.py", line 7, in merge
while i < len(left) and j < len(right):
TypeError: object of type 'NoneType' has no len()
似乎不知何故左右变量没有正确保存,因为如果我写这个我会得到更好的结果,尽管它仍然会出现错误(改变了我写“一起”的方式):
def mergesort(L):
"""Returns a new sorted list with the same elements as L"""
print (L)
if len(L) < 2:
return L[:]
else:
middle = int(len(L) / 2)
left = mergesort(L[:middle])
right = mergesort(L[middle:])
together = merge(mergesort(L[:middle]),mergesort(L[middle:]))
print( 'merged', together)
return
我明白了:
>>> test = [1, 3, 5, 6, 4, 7, 20, 9]
>>> mergesort(test)
[1, 3, 5, 6, 4, 7, 20, 9]
[1, 3, 5, 6]
[1, 3]
[1]
[3]
[1]
[3]
merged
[1, 3]
[5, 6]
[5]
[6]
[5]
[6]
merged [5, 6]
[1, 3]
[1]
[3]
[1]
[3]
merged [1, 3]
[5, 6]
[5]
[6]
[5]
[6]
merged [5, 6]
Traceback (most recent call last):
File "<pyshell#349>", line 1, in <module>
mergesort(test)
File "C:/Python27/python omg 2 samma/lec10.py", line 30, in mergesort
left = mergesort(L[:middle])
File "C:/Python27/python omg 2 samma/lec10.py", line 32, in mergesort
together = merge(mergesort(L[:middle]),mergesort(L[middle:]))
File "C:/Python27/python omg 2 samma/lec10.py", line 7, in merge
while i < len(left) and j < len(right):
TypeError: object of type 'NoneType' has no len()
【问题讨论】: