Skip to main content
 首页 » 编程设计

python之无法在 Python 中插入(无与空列表)

2025年05月04日14jyk

我正在尝试解决 Google 的 Python 类(class)中的以下练习。

E.给定两个按递增顺序排序的列表,创建并返回一个按排序顺序排列的所有元素的合并列表。您可以修改传入的列表。理想情况下,该解决方案应在“线性”时间内运行,对两个列表进行一次传递。

我正在使用以下方案方法(我希望我有汽车、CDR 和缺点!)。

def helper(list1, list2, result): 
  if list1 == None: 
    return result + list2 
  elif list2 == None: 
    return result + list1 
  elif list1[0] < list2[0]: 
    return helper(list1[1:], list2, result.insert(0, list1[0])) 
  else: 
    return helper(list1, list2[1:], result.insert(0, list2[0])) 
 
def linear_merge(list1, list2): 
  helper(list1, list2, []) 

我得到的错误是,当结果为 [] 时,我似乎无法将元素插入到结果中:

AttributeError: 'NoneType' object has no attribute 'insert' 

但这在控制台中运行良好:

>>> b = [] 
[] 
>>> b.insert(0, 4) 
>>> b 
[4] 

我是 Python 的新手,所以我有两个问题:

  1. None 与 [] 相比,我遗漏了什么?如何让这段代码发挥作用?
  2. 如果 Python 不适用于 Scheme/Lisp 方法,那么解决这个问题的“Python 方法”是什么?这对我来说不太重要,因为我可以检查解决方案。

谢谢!

请您参考如下方法:

list.insert 返回 None,而不是修改后的列表。

这需要将helper改为read

def helper(list1, list2, result): 
  if not list1: 
    return result + list2 
  elif not list2: 
    return result + list1 
  elif list1[0] < list2[0]: 
    return helper(list1[1:], list2, result + [list1[0]]) 
  else: 
    return helper(list1, list2[1:], result + [list2[0]]) 

请注意两个基本案例的变化。 None 和空列表 [] 不是一回事。测试列表是否为空的 pythonic 方法是将列表视为 bool 值:空列表为 False,所有其他为 True。


正如其他人在我之前注意到的那样,您需要在 linear_merge 中显式返回 helper 的返回值。