仅使用lambda函数删除重复项

2024-04-24 20:12:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

如果是这样,我们怎么能做到呢?在

在本例中,“removetheduplicates”意味着“在原始列表中只保留一个元素的出现”,因此[1,2,1,3,1,4]应该变成{}。在

另外,我们的目标是只写一个lambda,因此代码将是一行代码,如:

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

不能使用外部变量。在

另外,对于上述问题,不允许任何“花哨”的东西,尤其是set函数,以及reducemap。。。在

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


Tags: andlambda函数代码in元素only列表
1条回答
网友
1楼 · 发布于 2024-04-24 20:12:28

从理论的角度来看,如果一个计算问题需要一个输入和一个输出而没有副作用,lambda演算可能可以解决它(更一般地说,lambda演算是图灵完备的,cfwikipedia)。在

现在对于实现,下面的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)

以下是未包装的版本:

^{pr2}$

该函数包含以下递归函数的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封装了所有内容,它只接受一个列表作为参数。在

相关问题 更多 >