python - 仅使用 lambda 函数删除重复项

标签 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 ...

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

最佳答案

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

下面的 lambda 函数接受一个列表参数,并返回一个已删除所有重复项的列表:

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 将所有内容包装起来,它只接受一个列表作为参数。

关于python - 仅使用 lambda 函数删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41524133/

相关文章:

python - django admin中的嵌套显示(多外键)

lambda - Kotlin Lambda参数与抽象值

java - 用于调试目的的命名 (toString) Lambda 表达式

Java 8 List<V> 到 Map<K, V>

python - 了解 Python 中的异常处理

python 3.5 在 statsmodels ImportError : cannot import name '_representation'

python - 当我导入自己的 .py 文件时出现 TypeError

python - 在Python中查找循环列表中的点之间的前向距离

c# - 从委托(delegate)过滤器表达式中获取对象 Expression<Func<T,bool>>

c++ - clang 对 C++ 11 lambda 的支持