过滤任意嵌套列表的函数

时间:2016-12-24 14:32:55

标签: python python-2.7 list lambda functional-programming

由于双重条件,我无法找到如何将此函数写为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]]

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

2 个答案:

答案 0 :(得分:5)

首先,通过def定义过滤或映射函数作为常规函数没有任何问题,如果它对可读性有益 - 请记住"Readability counts" and "Sparse is better than dense"。仅仅因为语言中有内联lambda函数,并不意味着您必须将逻辑压缩到其中。

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

None

请注意,自filter() does not return a list以来,Python 3.x需要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))

演示:

list()

答案 1 :(得分:2)

嗯,这不是最佳做法,但您可以创建一个lambda函数:使用括号对条件进行分组:

f = lambda e: filter(None, [f(y) for y in e]) if isinstance(e, list) else (e if e > 10 else None)

my_list = [[1], [2, [3, 12, [4, 11, 12]]], [5, 6, 13, 14], [15]]

>>> f(my_list)
[[[12, [11, 12]]], [13, 14], [15]]

对于python 3用户:

f = lambda e: list(filter(None, [f(y) for y in e])) if isinstance(e, list) else (e if e > 10 else None)
相关问题