0

所以让我们说我这个功能:

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

我无法比较列表中的数字并使用递归将其放在正确的位置。

4

2 回答 2

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]

解释

  1. 如果myList为空,则返回numas 列表
  2. 如果num大于 的第一个元素myListnum则不能放在这里。所以,我们进一步递归,留下后面的第一个元素myList。(myList[1:]表示没有第 0 个元素)。例如,myListis [4, 7, 9]and numis 8。所以,我们把 4 抛在后面,用[7, 9]and 8 递归,仍然 8 大于 7,所以现在我们用[9]这次递归,8 小于 9,所以我们[8, 9]通过 else 部分返回。当递归展开时,我们得到[7, 8, 9],然后终于[4, 7, 8, 9]
  3. 如果num小于或等于 的第一个元素myList,那么这就是我们需要放置的地方num。因此,我们只需将num其放在开头myList并返回它。
于 2013-11-06T01:08:48.727 回答
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你的关系政策。

注意:这不会返回列表,它会修改旧列表,但很容易用原始列表的副本包装,首先给您留下两行squeeze功能。

于 2013-11-06T04:02:45.340 回答