当前位置: 首页 > 面试题库 >

仅使用Lambda函数删除重复项

东方方伟
2023-03-14
问题内容

我遇到了一个问题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

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


问题答案:

从理论上讲,如果计算问题需要输入和输出而没有副作用,那么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包装所有内容,仅使用列表作为参数。



 类似资料:
  • 我需要从String的ArrayList中删除重复项,而不考虑大小写。对于情商: 上面的不会提供任何帮助,因为它工作在将返回false的equals方法上。有没有其他方法可以做以下事情:

  • 可能重复: PostgreSQL是否支持“重音不敏感”排序规则? 我试图删除重音,所以当我选择时,它会忽略它们。 例子: 它返回: 或者类似的东西。 我发现这些函数无法工作,我想这可能是因为我使用的是Struts 1。十、 请检查它们,告诉我哪里错了,或者我应该使用什么其他功能。 第一个函数 第二个功能 在NetBeans中运行文件时,这两个函数都会生成以下错误:

  • 如果我不使用' a '和' b '变量,一切正常,否则,C返回: 错误:无法转换“main()::” 注意:初始化'void f(int, void(*)(int))'的参数2

  • 请注意,在转向您之前,我已经浏览了各种帖子。事实上,我尝试实现中提供的解决方案:基于“notin”条件从数据帧中删除行 我的问题如下。让我们假设我有一个巨大的数据帧,我想删除重复的数据帧。我很清楚我可以使用drop_duplicates,因为这是最快的最简单的方法。然而,我们的老师希望我们创建一个包含重复项ID的列表,然后根据这些值是否包含在上述列表中删除它们。 现在,让我们看看输出: 因此,我得

  • 我尝试只删除 1 个项目,或者当我使用打开的库存单击它时保留项目堆栈,但是,方法:,删除库存中的所有类似项目,如何只删除 1 个项目,或 1 ?