我遇到了这个问题 Python - Removing duplicates in list only by using filter and lambda ,其中 OP 询问如何仅使用 filter
和 lambda
函数从 Python 列表中删除重复元素。
这让我想知道,从理论上的角度来看,是否有可能仅使用 lambda
函数从 Python 列表中删除重复项?
如果是这样,我们该怎么做?
在这种情况下,“删除重复项”意味着“保留原始列表中出现的每个元素恰好出现一次”,因此 [1,2,1,3,1,4]
应该成为 [1,2,3,4]
。
此外,我们的目标是只编写一个 lambda
,因此代码将是一行代码,例如:
lambda l: """do something that returns l without duplicates"""
不得使用外部变量。
此外,对于上面的问题,不能有任何“花哨”的地方,尤其是set
函数,还有reduce
、map
...
基本上,不应调用其他函数,即使是内置函数。
最佳答案
从理论的角度来看,如果一个计算问题需要输入和输出没有副作用,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/