我强烈怀疑您是否可以通过理解访问实际构建的列表,因为到目前为止它还不存在。
然而,这并不意味着您不能建立一个以功能方式删除重复项的列表。(请记住,python 不允许 TCO。)
如果我们想从另一个列表构建一个列表,只使用列表而不是集合、有序集合等,一种方法可能是(中途函数式):
def removeDuplicates (inList, acc):
if not inList: return acc
if inList [0] in acc: return removeDuplicates (inList [1:], acc)
return removeDuplicates (inList [1:], acc + [inList [0] ] )
#even tail-recursive, although this doesn't help in python
print (removeDuplicates ( [1,2,3,2,3,5,1], [] ) )
作品。所以让我们用它构建一个 lambda 表达式:
rd = lambda inList, acc: acc if not inList else rd (inList [1:], acc + ( [] if inList [0] in acc else [inList [0] ] ) )
print (rd ( [1,2,3,2,3,5,1], [] ) )
也有效。现在让我们为匿名和递归准备这个 lambda:
rd2 = lambda f, inList, acc: acc if not inList else f (f, inList [1:], acc + ( [] if inList [0] in acc else [inList [0] ] ) )
rec = lambda f, *a: f (f, *a)
print (rec (rd2, [1,2,3,2,3,5,1], [] ) )
仍然有效。现在让我们删除 lambda 的名称,我们得到一个递归 lambda,它从另一个构建列表,同时删除重复项(没有for
或其他命令式循环):
print ( (lambda f, *a: f (f, *a) ) (lambda f, inList, acc: acc if not inList else f (f, inList [1:], acc + ( [] if inList [0] in acc else [inList [0] ] ) ), [1,2,3,2,3,5,1], [] ) )
不完全可读,但功能和递归。
如果您喜欢函数式编程,那么lambda f, *a: f (f, *a)
肯定会成为您的密友。
inb4import this
和 PEP8。