【问题标题】:Object of type 'NoneType' has no len() in merge sort“NoneType”类型的对象在合并排序中没有 len()
【发布时间】:2021-03-08 06:19:15
【问题描述】:

我在 python 中实现了一个常见的合并排序算法,如下所示,但出现了意外的类型错误。

from typing import List

def merge(arr1: List[int], arr2: List[int]) -> List[int]:
    sorted_arr = []
    i, j = 0, 0
    while i < len(arr1) and j < len(arr2):
        if arr1[i] < arr2[j]:
            sorted_arr.append(arr1[i])
            i = i + 1
        else:
            sorted_arr.append(arr2[j])
            j = j + 1
    sorted_arr += arr1[i:]
    sorted_arr += arr2[j:]

def merge_sort(arr: List[int]):
    if len(arr) == 1:
        return arr
    mid = len(arr) // 2
    left_arr = merge_sort(arr[:mid])
    right_arr = merge_sort(arr[mid:])
    return merge(left_arr, right_arr)

错误是这样说的:

while i < len(arr1) and j < len(arr2):
TypeError: object of type 'NoneType' has no len()

我不知道为什么while 循环会出现类型错误。谁能帮我解决这个问题?谢谢。

【问题讨论】:

  • if len(arr) == 1: 应该是 if len(arr) &lt;= 1: 以允许空列表。

标签: python typeerror mergesort


【解决方案1】:

问题是您没有从 merge() 方法显式返回任何内容,如果没有显式返回任何内容,默认情况下它会返回 None

merge()方法末尾的sorted_arr返回为:

def merge(arr1: List[int], arr2: List[int]) -> List[int]:
    sorted_arr = []
    i, j = 0, 0
    while i < len(arr1) and j < len(arr2):
        if arr1[i] < arr2[j]:
            sorted_arr.append(arr1[i])
            i = i + 1
        else:
            sorted_arr.append(arr2[j])
            j = j + 1
    sorted_arr += arr1[i:]
    sorted_arr += arr2[j:]
    return sorted_arr  # return the sorted_arr

【讨论】:

  • 天哪,非常感谢。我在测试过程中不小心删除了那个 return 语句。非常感谢!
猜你喜欢
  • 2018-06-11
  • 2019-12-27
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 2021-03-03
  • 2012-08-02
相关资源
最近更新 更多