由于双重条件,我无法找到如何将此函数写为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方式是什么?
答案 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)