Python - 实现合并排序算法时出现类型错误
Python - TypeError while implementing merge sort algorithm
所以我是 python 的新手,目前正在学习列表操作。下面是我编写的用于对我的列表执行合并排序的程序。但是,在编译时,第 3-
行出现错误
而 len(lista) != 0 和 len(listb) != 0:
类型错误:'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)
首先,不要使用 list
作为标识符。
在您的合并函数中,在 else 块中,您将返回合并排序函数返回的内容。在 mergesort 函数中,您什么也没有返回。
此外,由于合并函数中的递归,您最终将变量 lista
和 listb
设置为合并函数的返回值,自 [=13 以来可能是 none =] 没有返回任何东西(因此 None)。
当您在合并排序中将 lista
和 listb
作为参数发送时,在这种情况下您实际上发送了 None,因此当您尝试通过 len
函数。
要消除错误,您可以发送修改后的结果进行合并,也可以处理在两个函数范围内都可用的列表。
那是因为在您的合并函数中,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)
您的代码令人困惑且有缺陷:
排序函数调用merge
,合并函数调用mergesort
。这与任何经典实现完全相反。
合并函数没有 return 任何东西,因此 lista
和 listb
从递归调用中设置为 None
和 mergesort
将 len
应用于不是列表的参数。
这是修改后的版本:
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)
所以我是 python 的新手,目前正在学习列表操作。下面是我编写的用于对我的列表执行合并排序的程序。但是,在编译时,第 3-
行出现错误而 len(lista) != 0 和 len(listb) != 0: 类型错误:'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)
首先,不要使用 list
作为标识符。
在您的合并函数中,在 else 块中,您将返回合并排序函数返回的内容。在 mergesort 函数中,您什么也没有返回。
此外,由于合并函数中的递归,您最终将变量 lista
和 listb
设置为合并函数的返回值,自 [=13 以来可能是 none =] 没有返回任何东西(因此 None)。
当您在合并排序中将 lista
和 listb
作为参数发送时,在这种情况下您实际上发送了 None,因此当您尝试通过 len
函数。
要消除错误,您可以发送修改后的结果进行合并,也可以处理在两个函数范围内都可用的列表。
那是因为在您的合并函数中,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)
您的代码令人困惑且有缺陷:
排序函数调用
merge
,合并函数调用mergesort
。这与任何经典实现完全相反。合并函数没有 return 任何东西,因此
lista
和listb
从递归调用中设置为None
和mergesort
将len
应用于不是列表的参数。
这是修改后的版本:
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)