【问题标题】:Error: object of type 'NoneType' has no len() while implemeting Merge Sort recursively错误:“NoneType”类型的对象在递归实现合并排序时没有 len()
【发布时间】:2019-12-27 00:50:23
【问题描述】:

我正在尝试使用 python 3.7 实现合并排序。为此,我编写了一个 merge() 函数和一个递归 sort() 函数。这里 sort() 函数打破一个列表,直到它有一个元素。但问题是解释器无法将合并函数的参数 m 和 n 识别为列表,因此显示以下错误:

def merge(m, n):
    x = y = 0
    v = []
    while x < len(m) and y < len(n):
        if m[x] < n[y]:
            v.append(m[x])
            x = x + 1
        elif m[x] > n[y]:
            v.append(n[y])
            y = y + 1
        else:
            v.append(m[x])
            x, y = x + 1, y + 1
    while x < len(m):
        v.append(m[x])
        x = x + 1
    while y < len(n):
        v.append(n[y])
        y = y + 1
    return v

def sort(a):
    if len(a) == 1:
        return a
    else:
        merge(sort(a[:len(a) // 2]), sort(a[len(a) // 2:]))

x = list(range(10, 0, -1))
sort(x)
print(x)

预期结果 id 排序列表。

但是python显示这个错误:

Traceback(最近一次调用最后一次): 文件“”,第 1 行,在 排序(x) 文件“”,第 5 行,排序中 合并(排序(a[:len(a) // 2]), sort(a[len(a) // 2:])) 文件“”,第 5 行,排序中 合并(排序(a[:len(a) // 2]), sort(a[len(a) // 2:])) 文件“”,第 5 行,排序中 合并(排序(a[:len(a) // 2]), sort(a[len(a) // 2:])) 文件“”,第 4 行,在合并中 当 x

【问题讨论】:

    标签: recursion python-3.7 mergesort


    【解决方案1】:

    关键是,如果 len(a) == 1,您的排序函数确实返回 a,但如果 len(a) != 1 则不返回任何内容。它应该是 return merge(...) 而不仅仅是 merge(...)在你的排序的其他部分。

    【讨论】:

    • 非常感谢您指出我犯的愚蠢错误。我真的很感谢你。
    • 在m[x] == n[y]时也有问题,因为只追加了m[x],但是x和y都是递增的。
    【解决方案2】:

    在 cmets 中记录的修复。作为替代方案,可以一次性分配工作数组,合并排序将只使用索引,而不是制作数组的多个副本。

    def merge(m, n):
        x = y = 0
        v = []
        while x < len(m) and y < len(n):
            if m[x] <= n[y]:                # fix
                v.append(m[x])
                x = x + 1
            else:
                v.append(n[y])
                y = y + 1
        while x < len(m):
            v.append(m[x])
            x = x + 1
        while y < len(n):
            v.append(n[y])
            y = y + 1
        return(v)
    
    def sort(a):
        if len(a) == 1:
            return(a)
        else:
            return(merge(sort(a[:(len(a)//2)]), sort(a[len(a)//2:])))
    
    # test sort
    x = list(range(10, 0, -1))
    x = sort(x)                             # fix
    print(x)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-02
      • 2018-06-11
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      相关资源
      最近更新 更多