亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

慕碼人8056858 2022-11-01 17:05:00
所以我是 python 新手,目前正在學習列表操作。下面是我編寫的用于對列表執行合并排序的程序。但是,在編譯時,我在第 3 行出現錯誤-而 len(lista) != 0 和 len(listb) != 0:    TypeError:“NoneType”類型的對象沒有 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)
查看完整描述

3 回答

?
呼如林

TA貢獻1798條經驗 獲得超3個贊

您的代碼令人困惑且有缺陷:

  • 調用排序函數并調用merge合并函數mergesort。這與任何經典實現完全相反。

  • 合并函數不返回任何內容,因此lista并從遞歸調用中listb設置為并應用于不是列表的參數。Nonemergesortlen

這是修改后的版本:

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)


查看完整回答
反對 回復 2022-11-01
?
慕田峪9158850

TA貢獻1794條經驗 獲得超7個贊

首先,不要list用作標識符。

在您的合并函數中,在 else 塊中,您將返回合并排序函數返回的內容。在合并排序函數中,您什么也沒有返回。

此外,由于合并函數中的遞歸,您最終會設置變量lista并返回合并函數的值,因為沒有返回任何內容(因此沒有),因此listb可能沒有返回值。mergesort

當您將這些listalistb合并排序作為參數發送時,您實際上在這種情況下發送 None ,因此當您嘗試通過len函數獲取它們的長度時會出錯。

要消除錯誤,您可以將修改后的結果發送到合并,或者可以在兩個函數范圍內可用的列表上工作。


查看完整回答
反對 回復 2022-11-01
?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

那是因為在您的合并函數中, lista 和 listb 正在變為 None 并傳遞給該函數您的 merge_sort 函數也不正確。您可以使用以下代碼處理您的錯誤:


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)


查看完整回答
反對 回復 2022-11-01
  • 3 回答
  • 0 關注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號