关于python:递归函数如何返回列表元组?

How does a recursive function returns a tuple of lists?

问题是:定义一个名为separate的递归函数;它传递一个谓词和一个列表;它返回一个2元组,其0索引是参数列表中谓词返回为真的所有值的列表,其1索引是参数列表中谓词返回为假的所有值的列表。调用separate(predicate.is_positive,[1,-3,-2,4,0,-1,8])返回([1,4,8], [-3,-2,0,-1])。注0不为正。提示:和Notes中的power函数的快速版本一样,您可以定义和绑定(但不能重新绑定)本地名称,也可以编写嵌套函数(比如power中的square)来帮助计算。

下面是他的幂函数示例:

1
2
3
4
5
6
7
8
9
def power(a,n):
    def square(n) : n*n
    if n == 0:
        return 1
    else:
       if n%2 == 1:
           return a*power(a,n-1)
       else:
           return square( power(a,n//2) )

我的尝试:

1
2
3
4
5
6
7
8
9
10
11
12
def separate(p,l):
    l1=[]
    l2=[]
    if l == []:
        return [],[]
    else:
        if p(l[0]):
            l1=([l[0]]+map_pos(p,l[1:]))
            return l1,l2
        else:
            l2.extend([l[0]]+separate(p,l[1:]))
            return l1,l2

调用此函数:print(predicate.is_positive,[1, -3, -2, 4, 0, -1, 8])会给我:TypeError: can only concatenate list (not"tuple") to list

注意predicate.is_positive是来自predicate模块的函数,它接受一个int,如果int为正数则返回true。

有人能帮我吗?用实际的代码将是很好的,真的很感激。


这可能是你想做的

1
2
3
4
5
6
7
8
9
10
11
12
13
def separate(p, L):
    if L == []:
        return [], []

    l1, l2 = separate(p, L[1:])

    item = L[0]

    if p(item):
        l1.append(item)
    else:
        l2.append(item)
    return l1, l2

由于L[1:]为每个项目创建了一个新列表,所以效率不是很高。

可以使用默认参数来避免进行切片

1
2
3
4
5
6
7
8
9
10
11
12
13
def separate(p, L, idx=0):
    if idx == len(L):
        return [], []

    l1, l2 = separate(p, L, idx + 1)

    item = L[idx]

    if p(item):
        l1.append(item)
    else:
        l2.append(item)
    return l1, l2

看起来还是很笨拙。这不是一个真正需要递归解决方案的任务