我遇到了问题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
......
基本上,不应该调用其他函数,甚至是内置函数。
答案 0 :(得分:5)
从理论上看,如果计算问题需要输入和输出而没有副作用,则lambda演算可能可以解决它(更一般地说,lambda演算是图灵完成的,参见wikipedia)。 / p>
现在,对于实现,以下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
将所有内容都包装起来,只需要一个列表作为参数。