[英]Python - TypeError while implementing merge sort algorithm
所以我是 python 的新手,目前正在學習列表操作。 下面是我編寫的用於對列表執行合並排序的程序。 但是,在編譯時,我在第 3 行出現錯誤-
while len(lista) != 0 and len(listb) != 0: TypeError: object of type 'NoneType' has no len()
我怎樣才能解決這個問題?
def mergesort(lista, listb):
listc = []
while len(lista) != 0 and len(listb) != 0:
if lista[0] > listb[0]:
listc.append(listb[0])
listb.remove(listb[0])
else:
listc.append(lista[0])
lista.remove(lista[0])
if len(lista) == 0:
listc += listb
else:
listc += lista
print(listc)
def merge(list):
if len(list) == 0 or len(list) == 1:
return list
else:
mid = len(list) // 2
lista = merge(list[:mid])
listb = merge(list[mid:])
return mergesort(lista, listb)
list = [15, 12, 14, 17, 13, 11, 12, 16, 15]
merge(list)
您的代碼令人困惑且有缺陷:
排序 function 稱為merge
,合並 function 稱為mergesort
。 這與任何經典實現完全相反。
合並 function 不返回任何內容,因此lista
和listb
從遞歸調用中設置為None
並且mergesort
將len
應用於不是列表的 arguments。
這是修改后的版本:
def merge(lista, listb):
listc = []
while len(lista) != 0 and len(listb) != 0:
if lista[0] > listb[0]:
listc.append(listb[0])
listb.remove(listb[0])
else:
listc.append(lista[0])
lista.remove(lista[0])
if len(lista) == 0:
listc += listb
else:
listc += lista
return listc
def mergesort(list):
if len(list) < 2:
return list
else:
mid = len(list) // 2
lista = mergesort(list[:mid])
listb = mergesort(list[mid:])
return merge(lista, listb)
list = [15, 12, 14, 17, 13, 11, 12, 16, 15]
mergesort(list)
首先,不要使用list
作為標識符。
在您的合並 function 中,在 else 塊中,您將返回合並排序 function 返回的內容。 在合並排序 function 中,您什么也沒有返回。
此外,由於合並 function 中的遞歸,您最終將變量lista
和listb
設置為合並 function 的返回值,因為mergesort
沒有返回任何內容(因此沒有)。
當您在合並排序中將這些lista
和listb
作為 arguments 發送時,實際上在這種情況下發送 None,因此當您嘗試通過len
function 獲取它們的長度時會出現錯誤。
要消除錯誤,您可以將修改后的結果發送到合並,或者可以在兩個函數的 scope 中可用的列表上工作。
這是因為在您的合並 function 中,lista 和 listb 變為 None 並傳遞給 function 您的 merge_sort function 也不正確。 您可以使用以下代碼處理您的錯誤:
def mergesort(lista, listb):
listc = []
if not lista or not listb:
return None
while len(lista) != 0 and len(listb) != 0:
if lista[0] > listb[0]:
listc.append(listb[0])
listb.remove(listb[0])
else:
listc.append(lista[0])
lista.remove(lista[0])
if len(lista) == 0:
listc += listb
else:
listc += lista
print(listc)
def merge(list):
if len(list) == 0 or len(list) == 1:
return list
else:
mid = len(list) // 2
lista = merge(list[:mid])
listb = merge(list[mid:])
return mergesort(lista,listb)
list = [15, 12, 14, 17, 13, 11, 12, 16, 15]
merge(list)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.