过滤任意嵌套列表的函数

use*_*737 4 python lambda functional-programming list python-2.7

由于双重条件,我无法找到如何将此函数写为lambda:

def f(e):
    if not isinstance(e,list):
        if e >10:
            return e
    else:
        return filter(None,[f(y) for y in e])
my_list=[[1], [2,[3,12, [4,11,12]]], [5,6,13,14],[15]]

>>> f(my_list)
[[[12, [11, 12]]], [13, 14], [15]]
Run Code Online (Sandbox Code Playgroud)

另外,编写这样一个过滤任意嵌套列表的函数的pythonic方法是什么?

ale*_*cxe 5

首先,将过滤或映射函数定义为常规函数没有任何问题,def如果它对可读性有益 - 记住"可读性计数"和"稀疏比密集更好".仅仅因为lambda语言中有内联函数,并不意味着你必须将逻辑压缩到它中.

由于您最终希望为任意列表深度构建通用解决方案,因此可以通过+ 递归应用过滤函数来删除值:map()filter()None

def filter_function(e):
    if isinstance(e, list):
        return filter(None, map(filter_function, e))
    elif e > 10:
        return e

my_list = list(filter_function(my_list))  
Run Code Online (Sandbox Code Playgroud)

请注意,list()Python 3.x需要这样做,因为filter()它不会返回列表.


演示:

>>> my_list = [[1], [2, [3, 12, [4, 11, 12]]], [5, 6, 13, 14], [15]]
>>> 
>>> def filter_function(e):
...     if isinstance(e, list):
...         return filter(None, map(filter_function, e))
...     elif e > 10:
...         return e
... 
>>> 
>>> print(list(filter_function(my_list)))
[[[12, [11, 12]]], [13, 14], [15]]
Run Code Online (Sandbox Code Playgroud)