簡體   English   中英

Python - 實現合並排序算法時出現類型錯誤

[英]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 不返回任何內容,因此listalistb從遞歸調用中設置為None並且mergesortlen應用於不是列表的 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 中的遞歸,您最終將變量listalistb設置為合並 function 的返回值,因為mergesort沒有返回任何內容(因此沒有)。

當您在合並排序中將這些listalistb作為 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM