Python-实现合并排序算法时发生TypeError

问题描述 投票:0回答:2

所以我是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)
python algorithm mergesort
2个回答
0
投票

首先,不要使用list作为标识符。

在您的合并功能中,在else块中,您将返回由mergesort函数返回的内容。在mergesort函数中,您什么也不返回。

[另外,由于合并函数中的递归,您最终将变量listalistb设置为合并函数的返回值,由于mergesort不返回任何值(因此为无),因此可能为none。

[当在mergesort中发送那些listalistb作为参数时,在这种情况下实际上发送了None,因此,当您尝试通过len函数获取它们的长度时会出错。

要消除错误,您可以发送修改的结果以合并,或者可以在两个函数的作用域中都可用的列表上工作。


0
投票

这是因为在您的合并函数中,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)
© www.soinside.com 2019 - 2024. All rights reserved.