仅使用Lambda函数删除重复项

发布于 2021-01-29 14:59:22

我遇到了一个问题Python-
仅通过使用filter和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

基本上,不应调用其他函数,即使是内置函数。

关注者
0
被浏览
78
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    从理论上讲,如果计算问题需要输入和输出而没有副作用,那么lambda演算可能可以解决它(更一般地说,lambda演算是图灵完备的,请参阅Wikipedia)。

    现在,对于实现,以下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包装所有内容,仅使用列表作为参数。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看