【问题标题】:Mergesort in Python 3.4.3 not working; typeerror for NoneTypePython 3.4.3 中的合并排序不起作用; NoneType 的类型错误
【发布时间】:2015-09-13 15:18:44
【问题描述】:

我目前正在尝试排序和合并列表的代码,但我无法让它工作:

def mergesort(L):
    """Returns a new sorted list with the same elements as L"""
    print (L)
    if len(L) < 2:
        return L[:]
    else:
        middle = int(len(L) / 2)
        left = mergesort(L[:middle])
        right = mergesort(L[middle:])
        together = merge(left,right)
        print( 'merged', together)
        return

会发生这样的事情:

>>> test = [1, 3, 5, 6, 4, 7, 20, 9]
>>> mergesort(test)
[1, 3, 5, 6, 4, 7, 20, 9]
[1, 3, 5, 6]
[1, 3]
[1]
[3]
merged [1, 3]
[5, 6]
[5]
[6]
merged [5, 6]
Traceback (most recent call last):
  File "<pyshell#347>", line 1, in <module>
    mergesort(test)
  File "C:/Python27/python omg 2 samma/lec10.py", line 30, in mergesort
    left = mergesort(L[:middle])
  File "C:/Python27/python omg 2 samma/lec10.py", line 32, in mergesort
    together = merge(left,right)
  File "C:/Python27/python omg 2 samma/lec10.py", line 7, in merge
    while i < len(left) and j < len(right):
TypeError: object of type 'NoneType' has no len()

似乎不知何故左右变量没有正确保存,因为如果我写这个我会得到更好的结果,尽管它仍然会出现错误(改变了我写“一起”的方式):

def mergesort(L):
    """Returns a new sorted list with the same elements as L"""
    print (L)
    if len(L) < 2:
        return L[:]
    else:
        middle = int(len(L) / 2)
        left = mergesort(L[:middle])
        right = mergesort(L[middle:])
        together = merge(mergesort(L[:middle]),mergesort(L[middle:]))
        print( 'merged', together)
        return

我明白了:

>>> test = [1, 3, 5, 6, 4, 7, 20, 9]
>>> mergesort(test)
[1, 3, 5, 6, 4, 7, 20, 9]
[1, 3, 5, 6]
[1, 3]
[1]
[3]
[1]
[3]
merged
[1, 3]
[5, 6]
[5]
[6]
[5]
[6]
merged [5, 6]
[1, 3]
[1]
[3]
[1]
[3]
merged [1, 3]
[5, 6]
[5]
[6]
[5]
[6]
merged [5, 6]
Traceback (most recent call last):
   File "<pyshell#349>", line 1, in <module>
     mergesort(test)
   File "C:/Python27/python omg 2 samma/lec10.py", line 30, in mergesort
     left = mergesort(L[:middle])
   File "C:/Python27/python omg 2 samma/lec10.py", line 32, in mergesort
     together = merge(mergesort(L[:middle]),mergesort(L[middle:]))
   File "C:/Python27/python omg 2 samma/lec10.py", line 7, in merge
     while i < len(left) and j < len(right):
TypeError: object of type 'NoneType' has no len()

【问题讨论】:

    标签: python mergesort


    【解决方案1】:

    你的mergesort()返回None,除非L的长度小于2。你也需要返回together

    def mergesort(L):
        """Returns a new sorted list with the same elements as L"""
        print (L)
        if len(L) < 2:
            return L[:]
        else:
            middle = int(len(L) / 2)
            left = mergesort(L[:middle])
            right = mergesort(L[middle:])
            together = merge(left,right)
            print( 'merged', together)
            return together
    

    如果不这样做,如果L[:middle] 大于 1,leftright 最终将设置为 None,并且您的 merge() 调用失败。

    这个固定版本然后产生:

    >>> mergesort(test)
    [1, 3, 5, 6, 4, 7, 20, 9]
    [1, 3, 5, 6]
    [1, 3]
    [1]
    [3]
    merged [1, 3]
    [5, 6]
    [5]
    [6]
    merged [5, 6]
    merged [1, 3, 5, 6]
    [4, 7, 20, 9]
    [4, 7]
    [4]
    [7]
    merged [4, 7]
    [20, 9]
    [20]
    [9]
    merged [9, 20]
    merged [4, 7, 9, 20]
    merged [1, 3, 4, 5, 6, 7, 9, 20]
    [1, 3, 4, 5, 6, 7, 9, 20]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 2019-08-22
      • 2021-06-04
      • 2015-09-20
      • 2019-12-27
      • 2023-02-12
      相关资源
      最近更新 更多