所以让我说我的这个功能:
squeeze([1,4,7,9], 8)
squeeze([1,4,7,9], 0)
我希望函数返回一个包含以下内容的新列表:
[1,4,7,8,9]
[0,1,4,7,9]
我想使用递归来创建此函数,但我遇到了麻烦
def squeeze(x:list, num:int):
if len(x) == 1:
if num < x[0]:
return [num] + x #if the integer is less than the 1st value, put it in the front
elif x[0] < num < x[2]:
return [x[0]] + [num] + [x[2]] #put it in the list
#insert this number into the correct spot
else:
return squeeze(num, x[0:1]) + squeeze(num, x[1:]) #i don't think this is right
我无法比较列表中的数字并使用递归将其放在正确的位置。
答案 0 :(得分:3)
你可以这样做
def squeeze(myList, num):
if myList == []:
return [num]
elif num > myList[0]:
return [myList[0]] + squeeze(myList[1:], num)
else:
return [num] + myList
print squeeze([1,4,7,9], 10)
print squeeze([1,4,7,9], 8)
print squeeze([1,4,7,9], 0)
<强>输出强>
[1, 4, 7, 9, 10]
[1, 4, 7, 8, 9]
[0, 1, 4, 7, 9]
<强>解释强>
myList
为空,请返回num
列表num
大于myList
的第一个元素,则num
不适合此处。所以,我们进一步递归,留下myList
的第一个元素。 (myList[1:]
表示没有第0个元素)。例如,myList
为[4, 7, 9]
,num
为8.因此,我们将4留下并递归[7, 9]
和8,仍然8大于7,所以现在我们这次递归[9]
,8小于9,所以我们通过else部分返回[8, 9]
。当递归解除时,我们得到[7, 8, 9]
,然后得到[4, 7, 8, 9]
num
小于或等于myList
的第一个元素,则我们需要放置num
。因此,我们只需将num
放在myList
的开头并将其返回。答案 1 :(得分:0)
好的,已经有一个答案被赞成并接受但是这不仅仅是一个倾向/家庭作业的事情,而且有人真的想要这样做,这是一个模块。
查看bisect中可用的内容。
from bisect import insort
a = [1,4,7,9]
insort(a, 10)
print a
a = [1,4,7,9]
insort(a, 8)
print a
a = [1,4,7,9]
insort(a, 0)
print a
输出是预期的结果,但也有insort_left
和insort_right
来微调您的关系政策。
注意:这不会返回新列表,它会修改旧版本,但很容易用原始版本的副本包装,首先会留下两行{{ 1}}功能。