我正在尝试解决 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 的新手,所以我有两个问题:
- None 与 [] 相比,我遗漏了什么?如何让这段代码发挥作用?
- 如果 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 的返回值。
