函数接受谓词,列表返回元组

时间:2016-10-29 05:14:16

标签: python recursion

{[{ 
change = true;
name = data1;
},{
change = true;
name = data2;
}]}

该函数传递了一个谓词和一个列表;它返回一个2元组,其0索引是谓词返回True的参数列表中所有值的列表,其1索引是谓词返回False的参数列表中所有值的列表。您可以使用+来连接列表,但不能改变任何列表(例如,没有要追加的调用)。

调用单独的((lambda x:x> = 0),[1,-3,-2,4,0,-1,8])返回

def separate(p : callable, l : [object]) -> ([object],[object]):
    z = []
    d = []
    for item in l:
        if p(item):
            z  + [item]
            new_l = l.pop(item)
            separate(p,new_l)
        else:
            d + [item]
            new_l = l.pop(item)
            separate(p,new_l)
    h = tuple((z,d))
    return h

但我不确定为什么我的函数会给我一个错误

([1,4,0,8],[-3,-2,-1]).

我得到的错误如下:

'int' object is not iterable

有人能告诉我如何解决它吗?非常感谢。

1 个答案:

答案 0 :(得分:2)

你的代码似乎没有决定它是递归地还是迭代地解决它 - 它有两者兼而有之。假设您有意引入了递归,让我们重新思考并简化解决方案:

def separate(predicate: callable, array: [object]) -> ([object], [object]):
    positive, negative = list(), list()

    if array:
        if predicate(array[0]):
            positive.append(array[0])
        else:
            negative.append(array[0])

        p, n = separate(predicate, array[1:])

        positive += p
        negative += n

    return positive, negative

示例

> python3 -i test.py
>>> separate((lambda x: x >= 0), [1, -3, -2, 4, 0, -1, 8])
([1, 4, 0, 8], [-3, -2, -1])
>>>  separate((lambda x: x % 2 == 0), [1, -3, -2, 4, 0, -1, 8])
([-2, 4, 0, 8], [1, -3, -1])
>>>