仅使用lambda函数删除重复项

时间:2017-01-07 17:08:28

标签: python lambda

我遇到了问题Python - Removing duplicates in list only by using filter and lambda,其中OP询问如何使用filterlambda函数从Python列表中删除重复元素。

这让我想知道,从理论的角度来看,是否有可能仅使用lambda函数从Python列表中删除重复项?

如果是这样,我们怎么做?

在这种情况下,“删除重复项”意味着“保留原始列表中每个元素只出现一次”,因此[1,2,1,3,1,4]应该变为[1,2,3,4]

此外,目标是只编写一个lambda,因此代码就像一行一样:

lambda l: """do something that returns l without duplicates"""

不得使用外部变量。

此外,对于上述问题,不允许任何“幻想”,特别是set函数,以及reducemap ......

基本上,不应该调用其他函数,甚至是内置函数。

1 个答案:

答案 0 :(得分:5)

从理论上看,如果计算问题需要输入和输出而没有副作用,则lambda演算可能可以解决它(更一般地说,lambda演算是图灵完成的,参见wikipedia)。 / p>

现在,对于实现,以下lambda函数接受一个list参数,并返回一个列表,其中删除了所有重复项:

lambda l: (lambda u, a: u(u, a)) ((lambda f, x: x if len(x) <= 0 else (f(f, x[1:]) if x[0] in x[1:] else ([x[0]] + f(f, x[1:])))), l)

这是一个未打开的版本:

lambda l:
    (lambda u, a: u(u, a))
    (
        (lambda f, x: x if len(x) <= 0
                        else
                        (
                            f(f, x[1:]) if x[0] in x[1:]
                                        else ([x[0]] + f(f, x[1:]))
                        )
         ),
         l
    )

该函数包含以下递归函数的lambda版本:

def f(l):
    if len(l) <= 0:
        return l
    elif l[0] in l[1:]:
        return f(l[1:])
    else:
        return ([l[0]] + f(l[1:]))

为了模拟递归调用,等效的lambda将另外一个函数作为参数,它本身就是:

lambda f, x: x if len(x) <= 0
               else
               (
                   f(f, x[1:]) if x[0] in x[1:]
                               else ([x[0]] + f(f, x[1:]))
               )

然后,另一个lambda调用此前一个函数,将自身作为参数传递(除了列表):

lambda u, a: u(u, a)

最后,外部lambda将所有内容都包装起来,只需要一个列表作为参数。