【问题标题】:Removing duplicates using only lambda functions仅使用 lambda 函数删除重复项
【发布时间】:2017-01-07 17:08:28
【问题描述】:

我遇到了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 函数,没有临时占位符/容器?
  • @wwii 编辑了我的问题;是的,代码必须只包含在一个 lambda 函数中,因此不允许使用额外的容器。
  • 有时这有点棘手,但通常你可以找到一种方法来编写函数的 lambda 版本,无论它可能多么混乱或不可读。
  • @wwii 检查我的答案,看看它有多乱 :)
  • lambda a: list(set(a))??

标签: python lambda


【解决方案1】:

从理论的角度来看,如果计算问题需要输入和输出而没有副作用,则 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 将所有内容包装起来,它只接受一个列表作为参数。

【讨论】:

  • 整洁。出于某种原因,我想到了Greenspun's tenth rule ;-)
  • @snakecharmerb 确实,除了在这种情况下,C/Fortran 是 Python,Common Lisp 是 Python :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 2012-01-10
  • 1970-01-01
  • 2021-04-07
相关资源
最近更新 更多